作者DicYang (寂屋出租)
看板MacDev
标题Re: [问题] multi-thread communication
时间Sat Nov 2 15:03:50 2013
※ 引述《DicYang (寂屋出租)》之铭言:
: 请问大家~
: mac上有什麽可以用的object可以做到像win32 api的
: waitforsingleobject/waitformultipleobjects这类的功能吗?
: 谢谢
不好意思又有个新的问题了
假设我有1个main thread,和4个child thread(这4个child thread所需要执行
的function是一样的,就假设每个thread依序要执行func1~func8好了)
其中宣告一个global的NSCondiction* syncCondition
我想要让这4个child thread同时一起执行func5
所以我就在每个thread要开始执行
func5前都先去用NSNotification去notify main thread接着再马上去呼叫
[syncConditoin wait]去等待(等待main thread叫醒)
而每次main thread收到notification後就去检查是否这4个child
thread都已经在等待了(这里的检查方法很烂,是用个counter来判断的),
如果是的话main thread就会去invoke
[syncCondition broadcast]去唤醒这4个child thread继续执行
问题来了:
1. 最後一个child thread去送notification後,main thread就马去下broadcast了,
所以最後一个child thread就会卡死在wait里面,其中3个thread会醒来
2. 接1,我目前的解法是让每次下notification之前先sleep 1秒,这样可以很丑的
解掉,有没有什麽比较好的解法呢?
3. 有没有方法可以知道一个thread是否在condition wait时卡住呢?
4. 有没有什麽更好的写法可以建议呢?
谢谢~
下面是我的code:
[main thread]
-(void)handleSyncEvent
{
static int syncEventCount = 0;
@synchronized(self)
{
++syncEventCount;
if (4==syncEventCount) {
syncEventCount = 0;
[ExecuteObject wakeupAll];
}
}
}
[child thread]
+(void)lockMe
{
[syncLock lock];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
[NSThread sleepForTimeInterval:1];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@"SyncEventNotification" object:nil];
});
[syncLock wait];
[syncLock unlock];
}
+(void)wakeupAll
{
[syncLock broadcast];
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.85.171.79