Що таке потік в c stack overflow російською

заданий 5 Березня '13 о 11:15

Для початку потрібно зрозуміти, що в українській мові одним словом «потік» переводять два різних терміна. Перше - потік виконання, він же thread. друге - потік даних, він же stream.

Знаю що в C ++ немає своїх потоків

Невірно. В останньому стандарті потоки виконання вже є. А потоки даних там є вже давно. І те, і інше в кінцевому рахунку реалізується через операційну систему.

але як представляти потік (даних)

в який момент часу працює або постійно працює

Після того, як потік запустили, він починає працювати до тих пір, поки не завершить свою роботу. Для початку вважайте, що він виповнюється паралельно. Купа запущених програм, які працюють одночасно, не бентежать? З потоками теж саме. Більш того, на самому ділі процеси не виконуються - це просто контейнери. Виконуються потоки. Як наслідок, будь-який процес має хоча б один потік.

Різницю я описав вище.

Як її робити, якщо потрібен потік даних?

Насамперед потрібно створити функцію, яка буде виконуватися в окремому потоці. Потім викликати відповідну функцію операційної системи (_beginthread. CreateThread тощо). Ось приклад .

В цілому, у Вашому питанні акуратно змішані питання про два типи потоків. Я спробував розділити і в основному відповісти про потоках виконання (thread).

Зараз буде твір на тему "як я провів студентські роки". Якщо я в чомусь помиляюся, прохання не агріться, а просто поправити мене.

Є додаток. Коли ви його запускаєте, з'являється процес. Процес - це завантажений в оперативну пам'ять екземпляр додатку. Кожен процес складається з потоків, можна навіть сказати, що процедури / функції процесів поділені між потоками. Потік може бути один або їх може бути кілька. Наприклад, якщо ви хочете, щоб під час запуску програми, у вас одночасно малювався інтерфейс і завантажувати дані з бази, то ці дві операції вам потрібно буде розділити на два потоки - інтерфейс буде на основному, а завантаження даних на додатковому.
йдемо далі
Який потік буде виконуватися швидше? На обробку кожного процесу система виділяє процесорний час, в залежності від пріоритету процесу (подивитися пріоритети Ви можете в диспетчері завдань). У кожного потоку всередині процесу так само є пріоритет, і за даними пріоритетам виділене процесорний час буде ділитися між потоками.

відповідь дан 5 Березня '13 о 11:23

Так як згаданий термін "многопоточность", пропоную ще один варіант "легкого вистави" про потоках виконання.

як представляти потік і що це взагалі таке, коли саме часу працює

будь-яка Ваша програма представляє з себе послідовність команд, які обробляє процесор, в однопоточному програмі - ця послідовність одна на процес, в багатопотокової - їх багато. Працюють вони в той момент, в який Ви їм дозвольте, тобто Ви можете запустити багато потоків відразу, або вони можуть запускатися при необхідності по певних подій, можуть завершуватися виконавши покладені на них обов'язки, або ж існувати весь час життя програми. Якщо Ви ставите питанням типу "навіщо їх придумали, є ж процеси", - відповідь така. на перемикання проецссора між різними процесами витрачається багато часу через те, що процеси мають власного простарнство пам'яті. При перемиканні між потоками ці витрати значно менше, так як потоки поділяють між собою більшу частину ресурсів програми. До того, що кожен з потоків не ділить з іншими однозначно можна віднести стек (стек процесу ділиться на кількість "містяться в ньому" потоків, кожному потоку дістається свій) і програмний лічильник. У загальному випадку потоки можна представляти як кілька шматок коду, що виконуються паралельно в рамках одного процесу.

в якій пам'яті він розташовується

так як потік виконання - це по суті шматок коду, то в пам'яті програм.

що таке многопоточность і як її зробити

многопоточность - властивість коду програми виконуватися паралельно (одночасно) на кількох ядрах процесора (шляхом призначення кожному ядру потоку виконання (шматка коду, який він повинен обробити)) або виконуватися псевдопараллельно на одному ядрі (кожен потік отримує в своє розпорядження деякий час, за яке він встигає виконати частину свого коду на процесорі). Розподілом потоків по ядрах зазвичай займається диспетчер, але при бажанні в коді програми можна явно прив'язати потік до якого-небудь ядру.

Зробити програму багатопотокової можна використовуючи спеціальні бібліотечні функції, наприклад з Boost або Intel TBB. У загальному випадку:

  1. запускаємо функцію створення потоку і передаємо їй код, який потік буде виконувати (покажчик на власну функцію, метод),
  2. використовуємо бібліотечні функції синхронізації в кодах своїх функцій / методів

Є так само більш прості способи, наприклад використання API стандарту OpenMP, який дає можливість розпаралелювання окремих шматків коду просто додаванням директив компілятора, але цей метод має свої обмеження в застосуванні і підходить не для всіх задач.

* Дану відповідь дає лише поверхневе уявлення про потоках виконання, як і просили.