在Linux中等待WaitForSingleObject和WaitForMultipleObjects

我正在从Windows到Linux迁移应用程序。 我WaitForSingleObjectWaitForMultipleObjects接口的问题。

在我的应用程序中,我产生了多个线程,其中所有线程都等待来自父进程的事件,或者每t秒周期运行一次。

我已经检查了pthread_cond_timedwait ,但是我们必须为此指定绝对时间。

我怎么能在Unix中实现这个?

坚持到pthread_cond_timedwait并使用clock_gettime 。 例如:

 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); 

如果你愿意的话,把它包装在一个函数中。


更新:根据我们的意见补充答案。

与Windows一样,POSIX没有一个API来等待“所有类型”的事件/对象。 每个人都有自己的功能。 通知线程终止的最简单方法是使用原子变量/操作。 例如:

主线程:

 // 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); 

次要线程:

 // 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 

另一种选择是使用pthread_cancel发送取消请求。 被取消的线程必须调用pthread_cleanup_push来注册任何必要的清理处理程序。 这些处理程序按照他们注册的相反顺序进行调用。 切勿从清理处理程序中调用pthread_exit ,因为它是未定义的行为。 取消线程的退出状态是PTHREAD_CANCELED 。 如果你选择这个选择,我建议你主要阅读取消点和类型。

最后但并非最不重要的是,调用pthread_join将使当前线程阻塞,直到通过参数传递的线程终止。 作为奖励,你会得到线程的退出状态。

我们(NeoSmart Technologies)刚刚发布了一个名为pevents的开源(MIT许可)库,它在POSIX上实现了WIN32手动和自动重置事件 ,并包含了WaitForSingleObject和WaitForMultipleObjects克隆。

虽然我个人建议你在POSIX机器上编码时使用POSIX多线程和信号范例,但是如果你需要的话,pevents可以给你另一个选择。

我意识到这是一个古老的问题,但是对于其他任何人来说,这个源代码表明,pthread_join()和WaitForSingleObject()的效果是一样的:

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

祝你好运!

对于WaitForMultipleObjects用false WaitAll试试这个:

 #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 asynchronousous 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; }