Windows Event implementation in Linux using conditional variables?

后端 未结 3 1995
星月不相逢
星月不相逢 2020-12-31 15:22

I am trying to implement very simple Windows events in Linux. Only for my scenario - 3 threads, 1 main and 2 secondary. Each of secondary threads raise 1 event by SetEvent a

相关标签:
3条回答
  • 2020-12-31 15:23

    I think semaphore is a better solution here, because it can be used inter-process. You can wrap the interface, if name is not provide, then use pthread_ to initialize it for intra-process to use, which can short the resource usage, but when name used, try to use sem initialize it, for intra-process use.

    0 讨论(0)
  • 2020-12-31 15:31

    There was similar question on stackoverflow already: WaitForSingleObject and WaitForMultipleObjects equivalent in linux

    In addition you can use semaphores:

    sem_t semOne  ;
    sem_t semTwo  ;
    sem_t semMain ;
    

    In main thread:

    sem_init(semOne,0,0) ;
    sem_init(semTwo,0,0) ;
    sem_init(semMain,0,0) ;
    
    ...
    
    
    sem_wait(&semMain);
    
    // Thread 1
    sem_wait(&semOne);
    sem_post(&semMain);
    
    
    // Thread 2
    sem_wait(&semTwo);
    sem_post(&semMain);
    

    Detailed description and various examples could be found here: ------http://www.ibm.com/developerworks/linux/library/l-ipc2lin3/index.html

    The previous link is no longer available. The most recent archived version at The Internet Archive's Wayback Machine is: https://web.archive.org/web/20130515223326/http://www.ibm.com/developerworks/linux/library/l-ipc2lin3/index.html

    0 讨论(0)
  • 2020-12-31 15:48

    Basing this on the description of WaitForSingleObject

    The WaitForSingleObject function checks the current state of the specified object. If the object's state is nonsignaled, the calling thread enters the wait state until the object is signaled or the time-out interval elapses.

    The difference between that behavior and the code is that the code will always wait on the condition variable, as it does not check a predicate. This introduces synchronization issues between the pthread_condt_timewait and pthread_cond_signal calls.

    The general idiom for signalling a condition variable is:

    lock mutex
    set predicate
    unlock mutex
    signal condition variable
    

    And when waiting for a condition variable:

    lock mutex
    while ( !predicate )
    { 
      wait on condition variable
    }
    unlock mutex

    Based on what is trying to be accomplished, a separate bool could be used as a predicate for each Event. By introducing a predicate, WaitForSingleObject should only wait on the condition variable if the Event has not been signaled. The code would look similar to the following:

    bool SetEvent (mutex, condition)
    {
        pthread_mutex_lock(mutex);                 // lock mutex
        bool& signalled = find_signal(condition);  // find predicate
        signalled = true;                          // set predicate
        pthread_mutex_unlock(mutex);               // unlock mutex
        pthread_cond_signal(condition);            // signal condition variable
    }
    
    int WaitForSingleObject(mutex, condition, timeout)
    {
        pthread_mutex_lock(mutex);                         // lock mutex
        bool& signalled = find_signal(condition);          // find predicate
        while (!signalled)
        {
          pthread_cond_timedwait(condition, mutex, timeout);
        }
        signalled = false;                                 // reset predicate
        pthread_mutex_unlock(mutex);                       // unlock mutex
    }
    
    0 讨论(0)
提交回复
热议问题