【发布时间】:2017-07-30 14:32:11
【问题描述】:
我正在用 C 创建一个多线程程序,但遇到了一些麻烦。 那里有创建线程的功能:
void create_thread(t_game_data *game_data)
{
size_t i;
t_args *args = malloc(sizeof(t_args));
i = 0;
args->game = game_data;
while (i < 10)
{
args->initialized = 0;
args->id = i;
printf("%zu CREATION\n", i);//TODO: Debug
pthread_create(&game_data->object[i]->thread_id, NULL, &do_action, args);
i++;
while (args->initialized == 0)
continue;
}
}
这里有我的 args 结构:
typedef struct s_args
{
t_game_data *object;
size_t id;
int initialized;
}args;
最后是处理创建线程的函数
void *do_action(void *v_args)
{
t_args *args;
t_game_data *game;
size_t id;
args = v_args;
game = args->game;
id = args->id;
args->initialized = 1;
[...]
return (NULL);
}
问题是:
主线程创建新线程的速度比新线程初始化变量的速度要快:
args = v_args;
game = args->game;
id = args->id;
因此,有时,2 个不同的线程会从 args->id 获得相同的 id。
为了解决这个问题,我使用变量initialized 作为布尔值,所以在新线程初始化期间让主线程“休眠”。
但我认为这确实是有罪的。 也许有一种方法可以使用互斥锁来做到这一点?但是我听说解锁不属于他的线程的互斥锁是不“合法的”。
感谢您的回答!
【问题讨论】:
标签: c multithreading pthreads libc