Подтвердить что ты не робот

Что означает "неотъемлемо потокобезопасный"?

Я столкнулся с этой строкой: "некоторые функции по сути являются потокобезопасными, например memcpy()"

Wikipedia определяет "thread-safe" как:

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

OK. Но что по сути означает? Связано ли это с наследованием?

4b9b3361

Ответ 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

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