2013-03-24 32 views
2

如果complete_all()會發生什麼叫做完成對象(從任務B)的任務A得到做完成對象wait_for_completion()過嗎?是否有一些API可以在等待時立即找到對象並立即返回?一種方法可能是使用在發送消息之前鎖定的mutex,並在等待之前解鎖。這個鎖需要在complete_all()之前獲得,並在之後發佈,但是想知道是否有更清潔/更好的方法。任何想法都歡迎。完成目標的競爭條件

更多上下文:任務A初始化完成對象,發送給任務B的請求與完成對象的地址一起,然後等待完成。 任務B在獲取消息時執行一些處理,然後對完成對象執行complete_all()

+1

內核已經處理這種情況afair。 – 2013-03-24 15:36:01

回答

2

如果complete()complete_all()wait_for_completion()之前對特定完成對象調用,則wait_for_completion()將立即返回。完成物體大致是這樣一個信號:

  • 在內部,完成對象具有done計數器被初始化爲0

  • wait_for_completion()休眠,直到done > 0(或者如果done已經大於立即進行0),並在返回之前自動遞減done

  • complete()增量done並喚醒第一個睡眠在wait_for_completion()的進程。

  • complete_all()doneUINT_MAX/2(有效無窮大),並喚醒大家在wait_for_completion()睡覺。

所以,如果我正確理解你的問題,沒有必要加入鎖定;完成對象的內部wait.lock螺旋鎖已經同步計數器訪問,以便您正在擔心的情況得到正確處理。