我现在正在写一个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(),这是一个很大的问题。
提前致谢。
答案 0 :(得分:3)
一旦pthread_create
返回通过值传递的所有内容都将被成功复制,实际上i
的使用在完全进入pthread_create
函数之前都会被评估。对于void *参数,指针本身也通过值传递。
例如,如果您通过引用(或指针)传递i
并使用它来访问启动例程内的数组,则存在创建竞争条件的可能性。但是在这个例子中并非如此。