2013-02-13 140 views
1

我的程序从文本文件中读入迷宫,然后主程序创建3个不同的线程来深入这个迷宫并搜索出口。当一个线程发现退出时,它将在主线程中发布它的解决方案路径。多线程和pthread_join

在这个迷宫中,有一些陷阱,当一个线程遇到时会“死掉”,将这个陷阱的位置保存到全局的已发现陷阱点阵列中,以便其他线程知道应该避免的地方。在该线程死亡后,主程序将重新生成另一个线程来取代它的位置并继续穿越迷宫。

一个线程可能遇到也可能不会遇到一个陷阱,而使用pthread_join只会等待一个特定的线程。我如何让主线程同时等待每个线程?

+0

你如何加入只有已经准备好的线程?就像在某处设置标志一样? – PlasmaHH 2013-02-13 10:39:01

+0

我的线程存储在pthread_t数组中,所以我可以使用全局整数来完成它吗? 像这样: pthread_mutex_lock(&mutex); while(!foundSolution) { pthread_cond_wait(&cond,&mutex); pthread_create(threads [exited],NULL,thrd_func,&pathfinder [exited]); } – 2013-02-13 11:07:33

回答

1

使用条件变量,它在pthreads中是pthread_cond_t。让主线程等待条件变量,并在线程死亡之前让它发出条件变量的信号。在伪代码是这样的:

主线程

//spawn first set of threads 
while(!done) { 
    pthread_cond_wait(&cond, &mutex); 
    //spawn another thread 
} 

工作者线程

//traverse maze 
pthread_cond_broadcast(&cond); 
//thread exit 

注意事项使用前需要获取和释放相关的互斥条件变量时。有关更多详细信息,请参阅pthread_cond_wait的手册页。

+0

我想问的一个问题,对于工作线程,我在信号广播之前还是之后(在退出之前)解锁互斥锁? – 2013-02-14 06:46:58

+0

在完成信号广播后,您应该解锁互斥锁。 – 2013-02-14 17:38:23