2014-10-27 75 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)。

还有比这更多的东西,但它应该让你过去当前的问题。

如果程序在互斥锁上冻结。它的死锁,你可能需要修改你的算法来阻止死锁。

相关问题