- 论坛徽章:
- 0
|
本帖最后由 mrguo 于 2010-08-22 20:18 编辑
有一段比较权威的例子,说的是将widows下的 WaitForMultipleObjects 如何转到 LINUX下面(附下),
不过,在下有点愚钝,有几个地方没有看明白:
第一个问题是:
WaitForMultipleObjects是有返回值的,通过返回值,可以知道哪个对象被触发了,
但是,根据下面的例子,在LINUX下面应该怎样处理呢?
第二个问题是:
为什么在子线程中都要一个sem_wait(&semOne)或者sem_wait(&semTwo)的语句?
目的是什么?必须放在线程程序的第一行吗?
希望各位高手能指点一下,多谢啦!!!
============================
附:将 WaitForMultipleObjects 转变到 LINUX 下
Windows example for any single object to be signaled
HANDLE hEvents[2];
DWORD i, dwRetCode;
// Create two event objects.
for (i = 0; i < 2; i++)
{
hEvents = CreateEvent(
NULL, // no security attributes
FALSE, // auto-reset event object
FALSE, // initial state is nonsignaled
NULL); // unnamed object
}
// The creating thread waits for other threads or processes
// to signal the event objects.
dwRetCode = WaitForMultipleObjects(
2, // number of objects in array
hEvents, // array of objects
FALSE, // wait for any
INFINITE); // indefinite wait
// Return value indicates which event is signaled.
switch (dwEvent)
{
// hEvent[0] was signaled.
case WAIT_OBJECT_0 + 0:
// Perform tasks required by this event.
break;
// hEvent[1] was signaled.
case WAIT_OBJECT_0 + 1:
// Perform tasks required by this event.
break;
// Return value is invalid.
default:
// probe for error
}
Linux equivalent code using POSIX
// Semaphore
sem_t semOne ;
sem_t semTwo ;
sem_t semMain ;
// Main thread
sem_init(semOne,0,0) ;
sem_init(semTwo,0,0) ;
sem_init(semMain,0,0) ;
// create 2 threads each one waits on one semaphore
// if signaled signals the main semaphore
sem_wait(&semMain);
// Thread 1
sem_wait(&semOne);
sem_post(&semMain);
// Thread 2
sem_wait(&semTwo);
sem_post(&semMain); |
|