Re: [問題] multi-thread communication

看板MacDev作者 (寂屋出租)時間10年前 (2013/11/02 15:03), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/4 (看更多)
※ 引述《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
文章代碼(AID): #1ITAFOc1 (MacDev)
討論串 (同標題文章)
文章代碼(AID): #1ITAFOc1 (MacDev)