2014-10-27 2 views
0

Я реализую проблему столовых философов в c, используя pthreads. Каждый философ представлен нитью. Каждый поток должен иметь возможность выполнять четыре различные функции.Изменение функции, выполняемой нитью

Я знаю, что я могу установить поток для выполнения функции с:

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

Это прекрасно, но как мне сделать нить выполнить другую функцию позже (т.е. func2).

Есть ли способ изменить функцию, выполняемую нитью, или я полностью отключен от шара?

Благодаря

+0

Мне любопытно, каковы 4 функции? – ooga

+0

Err .. если вы хотите, чтобы нить выполняла другую функцию, вы могли бы ошибиться .. назовите ее? –

+0

Я только понимаю, как вызвать функцию из основного потока, который запускает программу. Как вы вызываете функцию из потока? – user3233706

ответ

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

1

Вам не нужно менять функцию, в которой работает нить. Вы должны представлять каждого философа нитью (как вы сказали) и каждой вилкой с мьютексом.

философ нити будет просто запустить цикл из 2-х функций думаю затем едят.

думаю, - это просто вызов для сна.

eat попытается приобрести 2 мьютекса, которые представляют его смежные вилки. Философский поток будет заблокирован в ожидании разблокировки мьютексов. как только они разблокируются, он может запереть их самостоятельно (pickup_forks) и подождать короткий промежуток времени (спящий), затем разблокировать их (return_forks).

Существует больше, чем это, но оно должно пройти мимо вашей текущей проблемы.

Если ваша программа зависает при блокировке мьютекса. Это тупик, и вам, возможно, придется пересмотреть свой алгоритм, чтобы остановить тупик.

Смежные вопросы