2016-06-16 10 views
0

Ich habe n Threads, die jeweils ein Objekt O (k) ändern, wobei k 0 bis n-1 sein kann.Warte notify pthreads unix C++

Jetzt gibt es ein Listener-Thread l, die eine Warnung erhalten muss, wenn eines der Faden, k, dessen Objekt O geändert hat (k)

Was ist der schnellste Weg, um diese Situation zu implementieren?

+0

Sie können eine * Bedingung Variable * - Google für Details/Beispiele .... –

+0

@Ram Jeder Erfolg mit meiner Antwort unten? –

Antwort

2

Verwenden Sie eine Zustandsvariable Posix (oder sogar besser, Standard C++), wie bereits ein Kommentator vorgeschlagen. Sie können den zugehörigen Mutex verwenden, um ein std :: -Array von Flags zu schützen, ein Flag pro Worker-Thread. Wenn ein Worker-Thread sein Objekt ändert, erwirbt er Mutex und hebt sein Flag an. Wenn der Listener-Thread benachrichtigt wird, wird er das k: th-Objekt (entsprechend dem k: ten Flag in dem Array) bedienen und das Flag absenken, dann den Mutex freigeben.

Achten Sie darauf, Beispiele für Condvars zu lesen, damit Sie verstehen, wenn Mutex automatisch erworben/freigegeben wird.

Im Allgemeinen sind std C++ Threading Primitive einfacher zu verwenden, da sie z. RAII für die automatische Entsperrung von Mutexen usw. Auch für Nicht-Posix-Umgebungen geeignet. Aber hier ist ein pThreads Beispiel von

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

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

pthread_mutex_t count_mutex  = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER; 

void *functionCount1(); 
void *functionCount2(); 
int count = 0; 
#define COUNT_DONE 10 
#define COUNT_HALT1 3 
#define COUNT_HALT2 6 

main() 
{ 
    pthread_t thread1, thread2; 

    pthread_create(&thread1, NULL, &functionCount1, NULL); 
    pthread_create(&thread2, NULL, &functionCount2, NULL); 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    printf("Final count: %d\n",count); 

    exit(EXIT_SUCCESS); 
} 

// Write numbers 1-3 and 8-10 as permitted by functionCount2() 

void *functionCount1() 
{ 
    for(;;) 
    { 
     // Lock mutex and then wait for signal to relase mutex 
     pthread_mutex_lock(&count_mutex); 

     // Wait while functionCount2() operates on count 
     // mutex unlocked if condition varialbe in functionCount2() signaled. 
     pthread_cond_wait(&condition_var, &count_mutex); 
     count++; 
     printf("Counter value functionCount1: %d\n",count); 

     pthread_mutex_unlock(&count_mutex); 

     if(count >= COUNT_DONE) return(NULL); 
    } 
} 

// Write numbers 4-7 

void *functionCount2() 
{ 
    for(;;) 
    { 
     pthread_mutex_lock(&count_mutex); 

     if(count < COUNT_HALT1 || count > COUNT_HALT2) 
     { 
      // Condition of if statement has been met. 
      // Signal to free waiting thread by freeing the mutex. 
      // Note: functionCount1() is now permitted to modify "count". 
      pthread_cond_signal(&condition_var); 
     } 
     else 
     { 
      count++; 
      printf("Counter value functionCount2: %d\n",count); 
     } 

     pthread_mutex_unlock(&count_mutex); 

     if(count >= COUNT_DONE) return(NULL); 
    } 

}