今天除錯ios程式,由於程式裡面使用了稍微的延時,就隨手寫了usleep函式,使用了幾個月沒啥問題,結果今天竟然阻塞了整個執行緒,讓程式出不來了,經查證原來usleep函式有那麼多問題,特記錄!哈哈
usleep() 有有很大的問題
1. 在一些平台下不是執行緒安全,如hp-ux以及linux
2. usleep() 會影響訊號
3. 在很多平台,如hp-ux以及某些linux下,當引數的值必須小於1 * 1000 * 1000也就是1秒,否則該函式會報錯,並且立即返回。
4. 大部分平台的幫助文件已經明確說了,該函式是已經被捨棄的函式。
5. posix規範中有乙個很好用的函式,nanosleep() ,該函式沒有usleep() 的這些缺點,它的精度是納秒級。在solaris的多執行緒環境下編譯器會自動把usleep() 連線成nanosleep() 。
linux下短延時推薦使用select函式.
什麼導致執行緒阻塞?
導致執行緒阻塞的原因主要有以下幾方面。1 執行緒進行了休眠 執行緒執行了thread.sleep int n 方法,執行緒放棄cpu,睡眠n毫秒,然後恢復執行。2 執行緒要執行一段同步 由於無法獲得相關的同步鎖,只好進入阻塞狀態,等到獲得了同步鎖,才能恢復執行。3 執行緒執行wait 進入阻塞狀態 ...
導致執行緒停止的條件
總結一下,乙個執行緒有10種方式可以暫停 1.i o 阻塞 2.同步阻塞 3.放棄 執行thread.yield 方法可以讓當前執行緒暫停 不會放棄自己的同步鎖 將資源讓給具有同等優先 級的,已經準備好執行的其它執行緒 也可能是自己 4.休眠 這是比放棄 thread.yield 更有力的放棄方式,...
多執行緒導致資料重複新增
多執行緒有序執行的方法!參考 多執行緒和執行緒池的總結以及常見的面試問題 1.測試用例 test public void testthread throws interruptedexception t1.start t1.join list.clear thread t2 new thread n...