WaitForSingleObject and WaitForMultipleObjects equivalent in Linux?

后端 未结 4 943
醉酒成梦
醉酒成梦 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: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.

提交回复
热议问题