我在使用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