2012-04-03 3 views
2

Я разрабатываю приложение для OpenSUSE 12.1.Thread - синхронизация и спальная нить отказываются проснуться (LINUX)

Это приложение имеет основной поток и другие два потока, выполняющие экземпляры тех же функций. Я пытаюсь использовать pthread_barrier синхронизировать все темы, но у меня возникают некоторые проблемы:

  1. Когда я помещал полученные нити, чтобы спать, они никогда не будут просыпаться по какой-то причине.
  2. (в случае, когда я удаляю сон из других потоков, бросая использование ЦП в небо). В какой-то момент все потоки достигают pthread_barrier_wait(), но ни одно из них не продолжает выполнение после этого.

Вот несколько псевдокодов, пытающихся проиллюстрировать, что я делаю.

pthread_barrier_t barrier; 
int main(void) 
{ 
    pthread_barrier_init(&barrier, NULL , 3); 
    pthread_create(&thread_id1, NULL,&thread_func, (void*) &params1); 
    pthread_create(&thread_id2v, NULL,&thread_func, (void*) &params2); 

    while(1) 
    { 
     doSomeWork(); 
     nanosleep(&t1, &t2); 

     pthread_barrier_wait(&barrier); 

     doSomeMoreWork(); 
    } 
} 

void *thread_func(void *params) 
{ 
    init_thread(params); 

    while(1) 
    { 
     nanosleep(&t1, &t2); 
     doAnotherWork(); 

     pthread_barrier_wait(&barrier); 
    } 
} 
+3

Создать небольшой пример, который может быть скомпилирован, или после реального соответствующего кода. Псевдокод может не иметь ошибки/ошибки вашего реального кода. – nos

+0

Правильно ли вы установили переменную t1? –

+0

Да, он правильно установлен. –

ответ

0

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

Можете ли вы прокомментировать больше о каких-либо других методах синхронизации или о том, какие функции работы есть?

Это пример программы я использую:

#include <pthread.h> 
#include <stdio.h> 
#include <time.h> 

struct timespec req = {1,0}; //{.tv_sec = 1, .tv_nsec = 0}; 
struct timespec rem = {0,0}; //{.tv_sec = 0, .tv_nsec = 0}; 

pthread_barrier_t barrier; 

void *thread_func(void *params) { 
    long int name; 
    name = (long int)params; 
    while(1) { 
     printf("This is thread %ld\n", name); 
     nanosleep(&req, &rem); 

     pthread_barrier_wait(&barrier); 

     printf("More work from %ld\n", name); 
    } 
} 

int main(void) 
{ 
    pthread_t th1, th2; 

    pthread_barrier_init(&barrier, NULL , 3); 
    pthread_create(&th1, NULL, &thread_func, (void*)1); 
    pthread_create(&th2, NULL, &thread_func, (void*)2); 

    while(1) { 
     nanosleep(&req, &rem); 
     printf("This is the parent\n\n"); 

     pthread_barrier_wait(&barrier); 
    } 
    return 0; 
} 
+0

Ну. Я использую мьютекс только для того, чтобы удостовериться, что я защищаю некоторые данные, но это поведение не меняется, если я удалю его. Работа действительно большая. Вовлекает SHM, некоторую обработку звука, некоторую проверку звука, но насколько я могу ее отлаживать, все это не имеет значения. Все, что я наблюдаю, это то, что потоки застревают во сне, кроме основного. Даже если я удалю барьеры, основной поток будет работать навсегда, а два других потока никогда не проснутся. –

+0

Thanx много для вашей помощи. –

+0

Возможно, я мог бы отправить вам некоторые из исходных файлов, но, возможно, это сделало бы что-то более запутанным. –

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