Потокобезопасность против атомарности в C - PullRequest
0 голосов
/ 15 мая 2019

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

Например, strcpy() или strdup() является своего рода поточно-безопасной функцией.

Но когда я читал справочную страницу, я увидел следующее и не понял изречения вместе с жирным примером.

Быть MT-Safe не означает, что функция является атомарной или использует любой из механизмов синхронизации памяти POSIX выставляет пользователям. Возможно даже, что вызов MT-Safe Последовательность функций не дает комбинации MT-Safe. Например, если поток вызвал две функции MT-Safe, одну сразу за другим не гарантирует эквивалент поведения на атомарное выполнение комбинации обеих функций, т.к. одновременные вызовы в других потоках могут мешать разрушительный путь.

Является ли следующее использование неправильным в функции потока? Если да, то каковы неправильные моменты? Если нет, что означает цитируемое высказывание жирным шрифтом?

char *s1 = calloc(14, 1);
char *s2 = calloc(6, 1);
char *s3 = strdup("soner");
char *s4 = strdup("stackoverflow");
strcpy(s2, s3);
strcpy(s1, s4);
s1[13] = s2[5] = 0;

mutex_lock(&mtx);
printf("%s %s", s1, s2);
fflush(stdout);
mutex_unlock(&mtx);

free(s1);
free(s2);
free(s3);
free(s4);

1 Ответ

3 голосов
/ 15 мая 2019

«MT-Safe» в этом контексте означает только то, что вы можете вызывать функцию из нескольких потоков, а не из-за какой-либо синхронизации между потоками.

Например, у вас есть два потока, один из которых выполняет strcpy(s1, "foo"), а другой выполняет strcpy(s1, "bar")s1 является буфером, совместно используемым потоками), тогда возникает гонка данных, поскольку оба потока могут пытаться выполнить запись в пункт назначения s1 одновременно.

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