2012-08-28 45 views
1

我已經完成了pthread_create(3)strace(1)。它間接調用了clone(2)系統調用。我應該在clone(2)中設置哪些標誌,以便它與pthread_create()相同?

還有將設置下列標誌:(我使用的i386 GNU/Linux操作系統(薄荷13))

CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID 

我好這一切的標誌。但我的問題是爲什麼pthread_create()設置爲CLONE_CHILD_CLEARTID標誌?根據我的知識,CLONE_CHILD_SETTID會在子內存中的位置ctid處設置子線程ID,並且CLONE_CHILD_CLEARTID將在子進程退出時將其清除。

(因爲沒有CLONE_CHILD_SETTID標誌設置,那麼爲什麼CLONE_CHILD_CLEARTID?)

是否真的需要?當我們想要使用clone(2)實現pthread_create()的功能時,我們需要設置什麼樣的理想標誌?

初學者在這個領域。

回答

5

那麼,你不能複製pthread_create只使用clone。編寫clone是爲了支持庫的使用,例如通過pthreads,但它自己基本​​上是一個非常可定製的線程fork函數。例如,

CLONE_CHILD_CLEARTID被設計爲支持pthread_join。它實質上做的是在ctid處將值清零,然後喚醒在該地址上調用futex_wait的線程。因此,pthread_join可以通過簡單地檢查以查看ctid是否爲零(並且如果是的話立即返回狀態),然後在必要時執行futex_wait(假設正確同步)來實現。

基本上,clonepthread_create的組成部分,但它不是唯一的部分。爲了支持更高級的用法,就像pthreads爲您提供的所有內容一樣,您必須在clone和其他調用之上編寫庫代碼。

相關問題