2014-10-27 65 views
0

我在使用pthreads的c中實現Dining Philosophers問題。每個哲學家都由一個線程表示。 每個線程都需要能夠執行四個不同的功能。更改線程執行的函數

我知道,我可以設置一個線程與執行功能:

pthread_create(&tid, &atr, func1, NULL); 

這很好,但如何使線程執行以後在不同的功能(即FUNC2)。

有沒有辦法改變線程正在執行的函數,還是我完全沒有球?

感謝

+0

我很好奇,這4個函數是什麼? – ooga 2014-10-27 22:05:39

+0

錯誤..如果你想要線程執行一個不同的功能,你可能會犯錯..打電話給它? – 2014-10-27 22:14:25

+0

我只理解如何從運行程序的主線程調用函數。你如何從一個線程中調用一個函數? – user3233706 2014-10-27 22:19:30

回答

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; 
} 
+0

這是行不通的,'to_run'在主線程和新創建的線程之間共享,訪問這個變量需要同步。 – MeLikeyCode 2017-06-09 05:09:57

1

您不應該更改線程正在運行的函數。你應該用一個線程來代表每個哲學家(如你所說)並且每個分支都帶有一個互斥體。

哲學家線程將只需運行的2種功能的迴路認爲然後

認爲只是一個呼叫睡覺。

將試圖獲得代表他的相鄰叉的2個互斥體。哲學家線程將被阻塞,等待互斥鎖解鎖。一旦他們解鎖,他就可以自己鎖定(pickup),然後等待一段時間(睡眠),然後解鎖它們(return_forks)。

還有比這更多的東西,但它應該讓你過去當前的問題。

如果程序在互斥鎖上凍結。它的死鎖,你可能需要修改你的算法來阻止死鎖。

相關問題