user3233706
user3233706

Reputation: 59

Changing the function that a thread executes

I'm implementing the Dining Philosophers problem in c using pthreads. Each philosopher is represented by a thread. Each thread needs to be able to execute four different functions.

I'm aware that I can set a thread to execute a function with:

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

That's fine, but how do I make the thread execute a different function later on (i.e. func2).

Is there a way to change the function that a thread is executing or am I off the ball entirely?

Thanks

Upvotes: 0

Views: 1591

Answers (2)

Paul Rooney
Paul Rooney

Reputation: 21609

You shouldn't need to change the function the thread is running. You should represent each philosopher with a thread (as you said) and each fork with a mutex.

The philosopher threads will simply run a loop of 2 functions think then eat.

think is just a call to sleep.

eat will try to acquire the 2 mutexes that represent his adjacent forks. The philosopher thread will be blocked waiting for the mutexes to unlock. once they unlock then he can lock them himself (pickup_forks) and wait a short period of time (sleep) then unlock them (return_forks).

There is more to it than that, but it should get you past your current problem.

If your program freezes on a mutex lock. Its a deadlock and you may have to revise your algorithm to stop the deadlock.

Upvotes: 1

ooga
ooga

Reputation: 15501

Here's a possibility, demonstrated with a single thread (aside from the main thread).

#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;
}

Upvotes: 1

Related Questions