Есть ли потенциальное состояние гонки в pthread_create ()? - PullRequest
1 голос
/ 08 ноября 2010

Я сейчас пишу программу pthread.Из того, что я испытал в C #, я думаю, что при создании потока может быть условие гонки.

for (i = 0; i < 10; i++)
{
    pthread_create(threads[i], NULL, &do_something, (void*)&data[i]);
}

Возможно ли, что локальная переменная i обновляется до создания нового потока?Следовательно, неверная запись данных или потоков в массивах может быть передана в функцию do_something?По крайней мере, в C #, если я использую Task.Factory.StartNew (), это большая проблема.

Заранее спасибо.

1 Ответ

3 голосов
/ 08 ноября 2010

Как только pthread_create вернет все, что передано по значению, оно будет успешно скопировано, фактически использование i все оценивается до того, как вообще войти в функцию pthread_create.Сам указатель здесь также передается по значению для аргумента void *.

Потенциал для создания условия гонки существует, например, если вы сами передавали i по ссылке (или указателю) и использовали это для доступамассив внутри процедуры запуска.В данном примере это не так.

...