WaitForSingleObject and WaitForMultipleObjects equivalent in Linux?

后端 未结 4 930
醉酒成梦
醉酒成梦 2020-11-29 04:21

I am migrating an applciation from windows to linux. I am facing problem with respect to WaitForSingleObject and WaitForMultipleObjects interfaces.

相关标签:
4条回答
  • 2020-11-29 04:36

    For what it's worth, we (NeoSmart Technologies) have just released an open source (MIT licensed) library called pevents which implements WIN32 manual and auto-reset events on POSIX, and includes both WaitForSingleObject and WaitForMultipleObjects clones.

    Although I'd personally advise you to use POSIX multithreading and signaling paradigms when coding on POSIX machines, pevents gives you another choice if you need it.

    0 讨论(0)
  • 2020-11-29 04:42

    I realise this is an old question now, but for anyone else who stumbles across it, this source suggests that pthread_join() does effectively the same thing as WaitForSingleObject():

    http://www.ibm.com/developerworks/linux/library/l-ipc2lin1/index.html

    Good luck!

    0 讨论(0)
  • 2020-11-29 04:46

    For WaitForMultipleObjects with false WaitAll try this:

    #include <unistd.h>
    #include <pthread.h>
    #include <stdio.h>
    
    using namespace std;
    
    pthread_cond_t condition;
    pthread_mutex_t signalMutex;
    pthread_mutex_t eventMutex;
    int finishedTask = -1;
    
    void* task(void *data)
    {
        int num = *(int*)data;
        // Do some
        sleep(9-num);
        // Task finished
        pthread_mutex_lock(&eventMutex); // lock until the event will be processed by main thread
        pthread_mutex_lock(&signalMutex); // lock condition mutex
        finishedTask = num; // memorize task number
        pthread_cond_signal(&condition);
        pthread_mutex_unlock(&signalMutex); // unlock condtion mutex
    }
    
    int main(int argc, char *argv[])
    {
        pthread_t thread[10];
    
        pthread_cond_init(&condition, NULL);
        pthread_mutex_init(&signalMutex, NULL); // First mutex locks signal
        pthread_mutex_init(&eventMutex, NULL); // Second mutex locks event processing
    
        int numbers[10];
    
        for (int i = 0; i < 10; i++) {
            numbers[i] = i;
            printf("created %d\n", i); // Creating 10 asynchronous tasks
            pthread_create(&thread[i], NULL, task, &numbers[i]);
        }
    
        for (int i = 0; i < 10;)
        {
            if (finishedTask >= 0) {
                printf("Task %d finished\n", finishedTask); // handle event
                finishedTask = -1; // reset event variable
                i++;
                pthread_mutex_unlock(&eventMutex); // unlock event mutex after handling
            } else {
                pthread_cond_wait(&condition, &signalMutex); // waiting for event
            }
        }
    
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-29 04:47

    Stick to pthread_cond_timedwait and use clock_gettime. For example:

    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    ts.tv_sec += 10; // ten seconds
    while (!some_condition && ret == 0)
        ret = pthread_cond_timedwait(&cond, &mutex, &ts);
    

    Wrap it in a function if you wish.


    UPDATE: complementing the answer based on our comments.

    POSIX doesn't have a single API to wait for "all types" of events/objects as Windows does. Each one has its own functions. The simplest way to notify a thread for termination is using atomic variables/operations. For example:

    Main thread:

    // Declare it globally (argh!) or pass by argument when the thread is created
    atomic_t must_terminate = ATOMIC_INIT(0);
    
    // "Signal" termination by changing the initial value
    atomic_inc(&must_terminate); 
    

    Secondary thread:

    // While it holds the default value
    while (atomic_read(&must_terminate) == 0) {
        // Keep it running...
    }
    // Do proper cleanup, if needed
    // Call pthread_exit() providing the exit status
    

    Another alternative is to send a cancellation request using pthread_cancel. The thread being cancelled must have called pthread_cleanup_push to register any necessary cleanup handler. These handlers are invoked in the reverse order they were registered. Never call pthread_exit from a cleanup handler, because it's undefined behaviour. The exit status of a cancelled thread is PTHREAD_CANCELED. If you opt for this alternative, I recommend you to read mainly about cancellation points and types.

    And last but not least, calling pthread_join will make the current thread block until the thread passed by argument terminates. As bonus, you'll get the thread's exit status.

    0 讨论(0)
提交回复
热议问题