我正在使用pthreads在c中实现Dining Philosophers问题。 每个哲学家都由一个线程代表。 每个线程都需要能够执行四种不同的功能。
我知道我可以设置一个线程来执行一个函数:
pthread_create(&tid, &atr, func1, NULL);
没关系,但是如何让线程稍后执行不同的功能(即func2)。
有没有办法改变线程正在执行的功能,还是我完全不在球上?
由于
答案 0 :(得分:1)
这是一种可能性,用单个线程证明(除主线程外)。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int to_run = 0;
void func0() {
to_run = -1;
while (to_run == -1) putchar('-');
}
void func1() {
to_run = -1;
while (to_run == -1) putchar('*');
}
void *func(void *data) {
while (1) {
switch (to_run) {
case 0:
func0();
break;
case 1:
func1();
break;
case 2:
printf("\nDONE\n");
return NULL;
}
}
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, func, NULL);
int i;
for (i=0; i<3; i++) {
sleep(1);
to_run = 1;
sleep(1);
to_run = 0;
}
to_run = 2;
pthread_join(tid, NULL);
return 0;
}
答案 1 :(得分:1)
您不需要更改线程正在运行的功能。你应该用一个线程代表每个哲学家(正如你所说)和每个分叉用互斥量。
哲学家线程将简单地运行一个包含2个函数的循环 think 然后 eat 。
认为只是一个沉睡的呼唤。
eat 将尝试获取代表其相邻叉子的2个互斥锁。将阻止哲学家线程等待互斥锁解锁。一旦他们解锁,他就可以自己锁定(pickup_forks)并等待一段时间(睡眠)然后解锁它们(return_forks)。
还有更多内容,但它应该让你超越当前的问题。
如果您的程序冻结了互斥锁。它是一个死锁,你可能需要修改你的算法来阻止僵局。