Re: [問題] multi-thread communication
※ 引述《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
討論串 (同標題文章)