Это потокобезопасный для strcmp? - PullRequest
3 голосов
/ 06 декабря 2010
strcmp(variable, "constant");

Или я должен защитить его мьютексом?

Ответы [ 5 ]

4 голосов
/ 06 декабря 2010

Если переменная может быть изменена другим потоком, вы должны защитить ее. Никакой магии здесь - языки высокого уровня могли бы делать такой вызов функции атомарно, и это «магия», отсутствующая в C.

Обратите внимание, что для защиты (с помощью одной блокировки) требуется как значение указателя 'variable' (адрес строки в памяти), так и сама строка (примечание: на нее может ссылаться и другой указатель). Если строка изменяется во время работы strcmp, вы можете получить ложный результат, переполнение буфера и ошибку сегментации.

2 голосов
/ 06 декабря 2010

Блокирует защиту данных, а не кода.

Поскольку strcmp не имеет возможности узнать, какую блокировку вы можете использовать для защиты variable, он никак не может получить эту блокировку, поэтому функция не является "поточно-ориентированной" в том смысле, в котором вы, вероятно, имеете в виду .

1 голос
/ 06 декабря 2010

Вам необходимо защитить доступ к переменной, если она является общей.
Несколько потоков, вызывающих strcmp, безопасны сами по себе (с точки зрения функциональности), поскольку strcmp просто сравнивает 2 строки и не вносит изменений.
Но, так как variable мог быть изменен другим потоком во время работы strcmp, модификация может сломать strcmp во время его работы, поэтому вы должны защищать его вместе со всеми другими местами, к которым вы обращаетесь variable.

0 голосов
/ 06 декабря 2010

Смотрите здесь: http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_09.html

В POSIX есть список небезопасных функций.Соответственно, по крайней мере на POSIX strcmp() будет поточно-ориентированным.

0 голосов
/ 06 декабря 2010

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

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