更改线程执行的功能

时间:2014-10-27 21:49:12

标签: c pthreads

我正在使用pthreads在c中实现Dining Philosophers问题。 每个哲学家都由一个线程代表。 每个线程都需要能够执行四种不同的功能。

我知道我可以设置一个线程来执行一个函数:

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

没关系,但是如何让线程稍后执行不同的功能(即func2)。

有没有办法改变线程正在执行的功能,还是我完全不在球上?

由于

2 个答案:

答案 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)。

还有更多内容,但它应该让你超越当前的问题。

如果您的程序冻结了互斥锁。它是一个死锁,你可能需要修改你的算法来阻止僵局。