當我們在需要用到每個線程私有的數據時, 都會使用pthread_key_create()函數來創建一個關聯的key, pthread_key_create()的第二個參數是一個函數指針, 手冊上指明當線程退出時,如果當前線程的key對應的值不為NULL時,會調用該函數.
但是看下面的例子:
在這個例子的主線程中創建key, 并且在主線程和兩個子線程中都使用pthread_setspecific()設置了自己的私有數據, 當我們的程序退出時就應該是要調用三次destory_key()函數吧, 可以不然, 我們只會看到destory_key()只被調用了二次.
但是請看main函數的倒數第二行注釋掉的pthread_exit()函數, 躍然我們大家都知道是有個主線程的, 但是我們都不會在main函數退出時調用pthread_exit()這個函數. 可是當我們加上這行後,就會發現destory_key()就會被調用三次, 正如我們認為的那樣.
還有個問題是我們使用pthread_create()創建的子線程, 即使我們不顯示的調用pthread_exit(),但是只要我們從線程函數中返回時,系統會做這個工作. 可是為什麽既然有主線程, 但是確不調用主線程的pthread_exit()呢? 期待有研究過pthread庫實現的牛人來給個解答.
另: 如果這是有意設計的方式, 那麽是否是說我們在主線程當中不應該使用pthread_setspecific(), 或者是不應該使用需要依賴pthread_create()中指定的銷毀函數的這樣的用法, 又或者,在main返回時調用pthread_exit() 是一個需要做,而又被我們給忽略了呢?
問題一大堆, 期待牛人解答.