Крім пунктів, згаданих в інших відповідях (важко довести, що операції незалежні, а програмісти думають серійно), є ще третій фактор, який слід врахувати: вартість паралелізації.
Правда полягає в тому, що паралелізм потоку пов'язаний з цим дуже суттєвими витратами:
Створення ниток дуже дороге: Для ядра запуск потоку - це приблизно те саме, що і запуск процесу. Я не впевнений у точних витратах, але я вважаю, що це близько десяти мікросекунд.
Спілкування потоків через мутекси є дорогим: зазвичай для цього потрібен системний виклик з кожної сторони, можливо, покладіть нитку на сон і знову прокинетесь, що спричиняє затримку, а також холодні кеші та промиті TLB. В середньому, прийняття та вивільнення мутексу коштує близько однієї мікросекунди.
Все йде нормально. Чому це проблема неявного паралелізму? Тому що неявний паралелізм найпростіше довести на малих масштабах. Одне довести, що дві ітерації простого циклу не залежать одна від одної, це зовсім інша справа - довести, що друк чогось до stdout
та відправка запиту до бази даних не залежать один від одного і можуть виконуватися паралельно ( процес з базою даних може бути з іншого боку труби!).
Тобто неявний паралелізм, який може довести комп'ютерна програма, ймовірно, невикористовується, оскільки витрати на паралелізацію перевищують перевагу паралельної обробки. З іншого боку, паралелізм великого масштабу, який може дійсно прискорити додаток, не підходить для компілятора. Подумайте, скільки роботи може виконати процесор протягом мікросекунди. Тепер, якщо паралелізація повинна бути швидшою за послідовну програму, паралельна програма повинна мати можливість утримувати всі процесори зайняті протягом декількох мікросекунд між двома викликами mutex. Для цього потрібен дійсно грубозернистий паралелізм, який майже неможливо довести автоматично.
Нарешті, жодне правило без винятку: експлуатація неявного паралелізму працює там, де жодні потоки не беруть участь, що є випадком векторизації коду (з використанням наборів інструкцій SIMD, таких як AVX, Altivec тощо). Це дійсно найкраще підходить для малого масштабу паралелізму, який порівняно легко довести.