我在使用pthreads的c中实现Dining Philosophers问题。每个哲学家都由一个线程表示。 每个线程都需要能够执行四个不同的功能。更改线程执行的函数
我知道,我可以设置一个线程与执行功能:
pthread_create(&tid, &atr, func1, NULL);
这很好,但如何使线程执行以后在不同的功能(即FUNC2)。
有没有办法改变线程正在执行的函数,还是我完全没有球?
感谢
我在使用pthreads的c中实现Dining Philosophers问题。每个哲学家都由一个线程表示。 每个线程都需要能够执行四个不同的功能。更改线程执行的函数
我知道,我可以设置一个线程与执行功能:
pthread_create(&tid, &atr, func1, NULL);
这很好,但如何使线程执行以后在不同的功能(即FUNC2)。
有没有办法改变线程正在执行的函数,还是我完全没有球?
感谢
这里有一个可能性,用一个单独的线程(除主线程)证明。
#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;
}
这是行不通的,'to_run'在主线程和新创建的线程之间共享,访问这个变量需要同步。 – MeLikeyCode 2017-06-09 05:09:57
您不应该更改线程正在运行的函数。你应该用一个线程来代表每个哲学家(如你所说)并且每个分支都带有一个互斥体。
哲学家线程将只需运行的2种功能的回路认为然后吃。
认为只是一个呼叫睡觉。
吃将试图获得代表他的相邻叉的2个互斥体。哲学家线程将被阻塞,等待互斥锁解锁。一旦他们解锁,他就可以自己锁定(pickup),然后等待一段时间(睡眠),然后解锁它们(return_forks)。
还有比这更多的东西,但它应该让你过去当前的问题。
如果程序在互斥锁上冻结。它的死锁,你可能需要修改你的算法来阻止死锁。
我很好奇,这4个函数是什么? – ooga 2014-10-27 22:05:39
错误..如果你想要线程执行一个不同的功能,你可能会犯错..打电话给它? – 2014-10-27 22:14:25
我只理解如何从运行程序的主线程调用函数。你如何从一个线程中调用一个函数? – user3233706 2014-10-27 22:19:30