Что означает "неотъемлемо потокобезопасный"?
Я столкнулся с этой строкой: "некоторые функции по сути являются потокобезопасными, например memcpy()
"
Wikipedia определяет "thread-safe" как:
Часть кода является потокобезопасной, если она управляет только совместно используемыми структурами данных таким образом, чтобы гарантировать безопасное выполнение несколькими потоками одновременно.
OK. Но что по сути означает? Связано ли это с наследованием?
Ответы
Ответ 1
Это не связано с наследованием. Это неформальное выражение и означает больше похожее
"некоторые функции являются потокобезопасными по своей природе". Например, функция, которая не
прикосновение к любым общим значениям/состояние является потокобезопасным, так или иначе. "по сути является потокобезопасным" .
Ответ 2
В этом контексте я интерпретирую его как "не будучи предназначенным для его достижения, он по-прежнему является потокобезопасным".
Нет прямой ссылки на концепцию наследования, хотя, конечно, слова связаны. Разумеется, это не пример наследования в объектно-ориентированном программировании. Это всего лишь функция, которая по своей сути приобретает свойство быть потокобезопасной.
Конечно, нет ничего волшебного в том, что memcpy()
также является поточно-безопасным. Любая функция без внутреннего состояния или "общих" побочных эффектов будет таким образом, поэтому функциональное программирование, где все функции должны быть "чистыми" и не иметь побочных эффектов, эффектов, хорошо подходит для параллельного программирования.
На практике типичным компьютерам трудно получить "настоящую работу" без побочных эффектов, особенно I/O очень сильно определяется ее побочными эффектами. Поэтому даже чистые функциональные языки часто имеют некоторые нефункциональные углы.
Обновить. Конечно, memcpy()
не имеет побочных эффектов, основная цель - манипулировать памятью, которая, если она разделена между потоками, безусловно, небезопасна. Предположение должно состоять в том, что до тех пор, пока области назначения отличаются друг от друга, не имеет значения, если один или несколько потоков выполняются параллельно memcpy()
.
Контрастируйте это, например. printf()
, который генерирует символы в одном (для процесса) выходном потоке. Он должен быть явно реализован (как требуется POSIX), чтобы быть потокобезопасным, тогда как memcpy()
не работает.
Ответ 3
Функциональная функция, защищенная потоками, безопасна без необходимости принимать какие-либо конкретные проектные решения в отношении потоковой передачи, она является потокобезопасной просто благодаря выполнению задачи, а не к перепроектированию для обеспечения безопасности потоков. Скажем, я пишу очень простую функцию:
int cube(int x)
{
return x*x*x;
}
Он по сути является потокобезопасным, поскольку он не может читать или записывать в разделяемую память. Однако я мог бы также создать функцию, которая не является потокобезопасной, но обеспечит ее потокобезопасность с помощью конкретного дизайна и синхронизации. Скажем, у меня есть аналогичная функция:
void cubeshare()
{
static int x;
x = x * x * x;
printf("%l", x);
}
Это не является потокобезопасным, вполне возможно, что он может иметь значение x изменения между каждым использованием (ну это на самом деле маловероятно в действительности, поскольку x будет кэшироваться, но позволяет сказать, что мы не делаем никакой оптимизации).
Мы могли бы сделать этот поток безопасным, как это (это псевдокод, реальный мьютекс более сложный):
void cubesharesafe(mutex foo)
{
static int x;
lockmutex(foo);
x = x * x * x;
printf("%l", x);
unlockmutex(foo);
}
Это, однако, не является по сути потокобезопасным, мы заставляем его пройти редизайн. Реальные примеры часто будут намного сложнее, чем это, но я надеюсь, что это дает идею, взятую на самый простой возможный уровень. Если у вас есть вопросы, прокомментируйте ниже.
Ответ 4
В случае memcpy
только один поток может обеспечить запись из определенного источника в конкретный пункт назначения.: поточно-безопасный по первоначальной конструкции.
Внутри означает: без необходимости "настраивать" базовую функцию для достижения цели, в этом случае: безопасность потоков.
Если несколько потоков могут одновременно помешать одному и тому же "каналу", вы столкнетесь с проблемой безопасности потоков, связанной с общими патронами данных.
Ответ 5
присущие средства Существующие в чем-то постоянном.
это не имеет никакого отношения к наследованию.
по умолчанию или уже некоторые методы являются потокобезопасными... для защиты или предотвращения проблем многозадачности.
вектор, хеш-таблица.. являются некоторыми из классов примеров, которые по сути являются потокобезопасными.
ничего..конфигурирование.. Есть некоторые функции, которые по умолчанию являются потоковыми.