C многопоточность происхождения - PullRequest
5 голосов
/ 22 апреля 2009

В моей копии C Programming Language (он же K & R), кажется, нет упоминания о многопоточности. Книга менее полная, чем я себе представлял? Возникла многопоточность после того, как она была написана? Я думаю об этом неправильно?

Где концепция многопоточности вписывается в мир C?

<ч />

Редактировать: Я думаю, что мой оригинальный вопрос был:

  • Вы можете написать что-нибудь на C
  • многопоточность существует
  • вы не можете написать многопоточность на C <- <em>логическое противоречие

Чем объясняется это противоречие? Где происхождение многопоточности? Если POSIX, то что написано в POSIX, если не C? Форма сборки, которая недоступна для C?

Ответы [ 6 ]

14 голосов
/ 22 апреля 2009

C - язык довольно низкого уровня. Поддержка потоков в типичной программе на C приходит из ОС, а не из среды выполнения C - если ваша среда не поддерживает потоки, вам придется реализовать их самостоятельно, найти библиотеку, которая это делает, или обходиться без потоков. Это отличается от языка, подобного Java, где среда выполнения предоставляет множество сервисов, которые гарантированно будут доступны для программ Java независимо от того, поддерживает ли их базовая ОС так, как это показывает платформа Java.

Теперь, сказав это, я почти уверен, что когда вышло первое издание K & R, Unix не поддерживал потоки. Поскольку C впервые был реализован как системный язык для среды Unix, неудивительно, что он не поддерживает нативные потоки.

Если вы пишете код для Unix-подобной среды, ищите потоки POSIX, если вам нужен хорошо поддерживаемый API для реализации многопоточных программ на C.

4 голосов
/ 22 апреля 2009

Книга завершена. C способен запускать потоки, но только с поддержкой времени выполнения, в котором он находится. C не поддерживает много вещей изначально. Например, если вы хотите открыть файл или получить данные от мыши, вам понадобится библиотека, которая обеспечивает такую ​​поддержку. Это хорошо, так как это означает, что C может работать на небольшом встроенном компьютере и не требует много памяти для функций, которые вы можете или не хотите.

Многопоточность была примерно до C. (Вот так: http://www.cs.clemson.edu/~mark/multithreading.html)

Вам нужна библиотека потоков. Например, на окнах вы можете:

#include "Windows.h"

int main()
{
   CreateThread(/*Google the function for details of the parameters.*/);   
   return 0;
}

Для этого вам нужно скачать Windows SDK для платформы. Большинство платформ имеют какой-то SDK, в котором есть библиотека с некоторыми функциями для создания потоков. Большинство из них имеют функцию стиля CreateThread, в которой вы передаете адрес функции, которую вы хотите, чтобы вновь запущенный поток начинал работать параллельно вашему текущему потоку, начавшемуся в основной функции.

Стандартизированная библиотека потоков, которую вы, возможно, захотите найти, - это posix.

3 голосов
/ 22 апреля 2009

Если я правильно помню, многопоточность фактически стала широко использоваться гораздо позже, чем язык программирования Си. Библиотека POSIX Threads является типичным способом выполнения многопоточности в программе Unix / Linux и не является частью стандартной библиотеки.

2 голосов
/ 22 апреля 2009

Языки C и C ++ не включают встроенные библиотеки потоков. Следовательно, разные платформы имели разные парадигмы по отношению к потокам (PThreads, функция WinAPI CreateThread (..), потоки MFC и т. Д.).

C ++ 0x будет включать в себя стандартную библиотеку потоков , кажется.

1 голос
/ 22 апреля 2009

Это упоминается в моем экземпляре (2-е издание) в главе «Введение» (стр. 2):

Аналогично, C предлагает только прямой поток управления с одним потоком: тесты, циклы, группирование и подпрограммы, но не мультипрограммирование, параллельные операции, синхронизация или сопрограммы.

1 голос
/ 22 апреля 2009

Многопоточность (или многопроцессорность) наверняка возникла до этого. Тем не менее, поддержка многопоточности в языке программирования недостаточна даже сейчас, особенно в C ее нет. Поэтому я думаю, что вы должны прочитать книгу, например. Потоки POSIX или любые другие потоки, поддерживаемые вашей средой (библиотеки потоков в настоящее время очень похожи друг на друга, по крайней мере, в принципах их примитивов синхронизации; странные вещи, такие как RCU, используются только в определенных средах).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...