關于pthread的線程私有數據.

當我們在需要用到每個線程私有的數據時, 都會使用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() 是一個需要做,而又被我們給忽略了呢?

     問題一大堆, 期待牛人解答.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值