多執行緒執行順序詭異現象談,你不知道的pthread_create
引文:學而時習之,不亦說乎。總是忙於具體專案,業務功能的實現;關於程式設計本身的技能都要有些生疏了,於是就選擇了幾個專題做了一次溫習,重點放在了多執行緒和多程式上,跑了一個例項,居然有新的發現:
(1)多個執行緒順序建立的順序=執行緒執行順序嗎?
(2)多個執行緒順序建立,回撥函式執行順序有規律嗎?
示例:
#include "apue.h" #include <pthread.h> void * thr_fn1(void *arg) { printf("thread 1 returning\n"); return((void *)1); } void * thr_fn2(void *arg) { printf("thread 2 exiting\n"); pthread_exit((void *)2); } int main(void) { int err; pthread_t tid1, tid2; void *tret; err = pthread_create(&tid1, NULL, thr_fn1, NULL); if (err != 0) err_quit("can't create thread 1: %s\n", strerror(err)); /*sleep(1);*/ err = pthread_create(&tid2, NULL, thr_fn2, NULL); if (err != 0) err_quit("can't create thread 2: %s\n", strerror(err)); err = pthread_join(tid1, &tret); if (err != 0) err_quit("can't join with thread 1: %s\n", strerror(err)); printf("thread 1 exit code %d\n", (int)tret); err = pthread_join(tid2, &tret); if (err != 0) err_quit("can't join with thread 2: %s\n", strerror(err)); printf("thread 2 exit code %d\n", (int)tret); exit(0); }
輸出:
thread 2 exiting
thread 1 returning
thread 1 exit code 1
thread 2 exit code 2
討論
看到這個順序是否有點意外,從多執行緒實現的機制來講,這個順序是沒問題的,建立的過程不等於執行的過程,各種教科書都會這麼告訴我們。可是我想知道的是,建立的順序是否和執行的順序有關係呢?還是用資料說話吧,我執行了10次,每次的輸出順序都是如此。這個引起了我的興趣。執行緒2為何每次都是優先於執行緒1執行呢?按照cup順序工作的原理,執行緒1應該先得到時間片才對啊,至少執行緒1和執行緒2應該具有同等的執行順序才對。為何每次的結果都是執行緒2限制性?卻是執行緒1先完成呢?糾結探索中,有條件的園友可以自己測試一下,看看是否有同樣的問題呢。
疑問1:同時建立執行緒是否執行緒2優先於1呢?-----單臺機器實測來看貌似如此。
疑問2:順序建立時間差增大,執行順序會如何?我線上程1建立後做了一個sleep(1),結果:
thread 1 returning
thread 1 exit code 1
thread 2 exiting
thread 2 exit code 2
疑問3:順序建立執行緒,執行緒2的執行順序為何優於執行緒1?探索中...!求答案!
環境
vmware8.0 + windows xp + REHL6.3
相關文章
- Linux c多執行緒執行順序Linux執行緒
- 多執行緒實現順序迴圈列印執行緒
- Python執行緒專題10:queue、多執行緒按順序執行Python執行緒
- kafka多執行緒順序消費Kafka執行緒
- 執行緒執行順序——CountDownLatch、CyclicBarrier 、join()、執行緒池執行緒CountDownLatch
- Java 多執行緒基礎(十一)執行緒優先順序和守護執行緒Java執行緒
- 【java】【多執行緒】睡眠/守護/加入/禮讓執行緒,執行緒優先順序(4)Java執行緒
- 利用訊號量實現執行緒順序執行執行緒
- 1v1影片原始碼,你知道如何實現多執行緒的順序執行嗎?原始碼執行緒
- 多執行緒-執行緒排程及獲取和設定執行緒優先順序執行緒
- 一個執行緒罷工的詭異事件執行緒事件
- 執行緒同步的詭異:求指點執行緒
- 你不知道的的 iOS 多執行緒iOS執行緒
- 多優先順序執行緒池實踐執行緒
- 程式設計思想之多執行緒與多程式(2):執行緒優先順序與執行緒安全程式設計執行緒
- join、volatile、newSingleThreadLatch 實現執行緒順序執行thread執行緒
- Java中如何保證執行緒順序執行Java執行緒
- SQL 執行順序 你懂的SQL
- 警惕執行緒的優先順序執行緒
- java執行緒優先順序Java執行緒
- 【高併發】深入理解執行緒的執行順序執行緒
- spring-kafka多執行緒順序消費SpringKafka執行緒
- 如何使用ReentrantLock的條件變數,讓多個執行緒順序執行?ReentrantLock變數執行緒
- 淺談多執行緒執行緒
- Java之執行緒的優先順序Java執行緒
- JavaScript的執行順序JavaScript
- mySQL 執行語句執行順序MySql
- Sql執行順序SQL
- java多執行緒的雜談Java執行緒
- 多執行緒的風險漫談執行緒
- 瀏覽器執行緒執行順序,瞭解一下瀏覽器執行緒
- 淺談 Java多執行緒Java執行緒
- 你是否真的懂 [程式的執行順序] 多程式 / 程式池
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- 執行緒與多執行緒執行緒
- 多執行緒和多執行緒同步執行緒