我正在尝试编写多线程代码,但我遇到了一个小问题。在我的程序中,我有两种类型的线程,explorers(我有 4 个或 5 个)和 main(我有一个)。我希望所有资源管理器线程同时运行,当它们都完成后,主线程开始工作。有一个循环,我一遍又一遍地做上面的事情。由于线程创建的开销,我决定让资源管理器线程在 main 运行时休眠并在它完成时唤醒它(当然反之亦然)。为了实现这个目标,我使用了障碍。以下是我的线程的伪代码:
主线程函数:
void* main(void* arg)
{
while(true)
{
wait_for_barrier_1
do_your_job
reset_barrier_1
wait_for_barrier_2
}
}
探索者线程函数
void* explorers(void* arg)
{
while(true)
{
do_your_job
wait_for_barrier_1
if(thread_id == 0)
{
reset_barrier_2
}
wait_for_barrier_2
}
}
barrier_1 用于在结束 explorer 之前阻止 main 运行,barrier_2 用于在结束 main 之前阻止 explorer。
我的问题是这段代码不能完全正确。一开始它工作正常,但经过两三次迭代后,一些资源管理器线程突然停止工作,因此整个程序将停止工作。
我无法弄清楚,特别是因为迭代次数没有规则。在某些运行中,它在第一次迭代后停止,在另一些运行中,它可以正常工作到第 5 次或第 6 次。
顺便说一句,我正在使用 Mac OSX。