摘要:基本線程的動作繼續之前語言線程的文章文章文章來了解基本的線程操作。屬性用完后對其進行清理回收通過共享的變量來檢測子線程是否已經結束代碼如下設置調度屬性線程庫提供以下調度策略先進先出調度。
基本線程的動作
繼續之前C語言線程的文章:文章1 文章2 來了解基本的線程操作。
設置線程屬性 設置脫離狀態下面代碼中關鍵的地方在于:
通過 res = pthread_attr_init(&thread_attr); 初始化一個線程屬性
通過 res = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); 將屬性設置為脫離狀態(PTHREAD_CREATE_DETACHED),即不能通過調用 pthread_join 來獲得另一個線程的退出狀態
另外還有一個常用的默認狀態是 PTHREAD_CREATE_JOINABLE ,可以允許兩個線程重新合并。
屬性用完后對其進行清理回收 (void)pthread_attr_destroy(&thread_attr);
通過共享的變量 thread_finished 來檢測子線程是否已經結束
代碼如下:
#include設置調度屬性#include #include #include void *thread_function(void *arg); char message[] = "Hello World"; int thread_finished = 0; int main() { int res; pthread_t a_thread; pthread_attr_t thread_attr; res = pthread_attr_init(&thread_attr); if (res != 0) { perror("Attribute creation failed"); exit(EXIT_FAILURE); } res = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); if (res != 0) { perror("Setting detached attribute failed"); exit(EXIT_FAILURE); } res = pthread_create(&a_thread, &thread_attr, thread_function, (void *)message); if (res != 0) { perror("Thread creation failed"); exit(EXIT_FAILURE); } (void)pthread_attr_destroy(&thread_attr); while(!thread_finished) { printf("Waiting for thread to say it"s finished... "); sleep(1); } printf("Other thread finished, bye! "); exit(EXIT_SUCCESS); } void *thread_function(void *arg){ printf("thread_function is running. Argument was %s ", (char *)arg); sleep(4); printf("Second thread setting finished flag, and exiting now "); thread_finished = 1; pthread_exit(NULL); }
線程庫提供以下調度策略:
| SCHED_FIFO | 先進先出 (FIFO) 調度。每個線程都有一個固定的優先級;當多個線程具有相同的優先級時,它們按照先進先出 (FIFO) 的順序運行直到完成 | | SCHED_RR | 循環 (RR) 調度。每個線程都有固定的優先級;當多個線程具有相同的優先級時,它們按照先進先出 (FIFO) 的順序在一個 固定的時間片內運行。 | | SCHED_OTHER | 缺省的 AIX? 調度。每個線程都有一個由調度程序根據線程的活動動態修改的初始優先級;線程的執行是按時間分割的。在其他系統上,這個調度策略可能會不同。 |
設置調度屬性和設置很相似:
#include取消線程#include #include #include void *thread_function(void *arg); char message[] = "Hello World"; int thread_finished = 0; int main() { int res; pthread_t a_thread; pthread_attr_t thread_attr; int max_priority; int min_priority; struct sched_param scheduling_value; res = pthread_attr_init(&thread_attr); if (res != 0) { perror("Attribute creation failed"); exit(EXIT_FAILURE); } res = pthread_attr_setschedpolicy(&thread_attr, SCHED_OTHER); if (res != 0) { perror("Setting schedpolicy failed"); exit(EXIT_FAILURE); } res = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); if (res != 0) { perror("Setting detached attribute failed"); exit(EXIT_FAILURE); } res = pthread_create(&a_thread, &thread_attr, thread_function, (void *)message); if (res != 0) { perror("Thread creation failed"); exit(EXIT_FAILURE); } max_priority = sched_get_priority_max(SCHED_OTHER); min_priority = sched_get_priority_min(SCHED_OTHER); scheduling_value.sched_priority = min_priority; res = pthread_attr_setschedparam(&thread_attr, &scheduling_value); if (res != 0) { perror("Setting schedpolicy failed"); exit(EXIT_FAILURE); } (void)pthread_attr_destroy(&thread_attr); while(!thread_finished) { printf("Waiting for thread to say it"s finished... "); sleep(1); } printf("Other thread finished, bye! "); exit(EXIT_SUCCESS); } void *thread_function(void *arg) { printf("thread_function is running. Argument was %s ", (char *)arg); sleep(4); printf("Second thread setting finished flag, and exiting now "); thread_finished = 1; pthread_exit(NULL); }
通過 int pthread_cancel(pthread_t thread); 來請求一個線程終止
通過 int pthread_setcancelstate(int state, int *oldstate) 來設置接受的進程是允許取消請求還是忽略它
通過 int pthread_setcanceltype(int type, int *oldtype) 來設置取消類型, PTHREAD_CANCEL_ASYCHRONOUS 代表接收到取消請求后立即行動, THREAD_CANCEL_DEFERRED 表示在接收到請求后,等待函數執行下述動作之一后才取消線程: pthread_join, pthread_cond_wait, pthread_cond_timeout, pthread_test_cancel, sem_wait, sigwait 等
代碼如下:
#include主線程創建多個線程示例#include #include #include void *thread_function(void *arg); int main () { int res; pthread_t a_thread; void *thread_result; res = pthread_create(&a_thread, NULL, thread_function, NULL); if (res != 0){ perror("Thread creation failed"); exit(EXIT_FAILURE); } sleep(3); printf("Caceling thread... "); res = pthread_cancel(a_thread); if (res != 0){ perror("Thread cancelation failed"); exit(EXIT_FAILURE); } printf("Waiting for thread to finish... "); res = pthread_join(a_thread, &thread_result); if (res != 0) { perror("Thread join failed"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } void *thread_function(void *arg) { int i, res; res = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); if (res != 0) { perror("Thread pthread_setcalcelstate failed"); exit(EXIT_FAILURE); } res = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); if (res != 0) { perror("Thread pthread_setcanceltype failed"); exit(EXIT_FAILURE); } printf("thread_function is running "); for(i=0; i<10; i++) { printf("Thread is still running (%d)... ", i); sleep(1); } pthread_exit(0); }
代碼如下:
#include#include #include #include #define NUM_THREADS 6 void *thread_function(void *arg); int main() { int res; pthread_t a_thread[NUM_THREADS]; void *thread_result; int lots_of_threads; for(lots_of_threads = 0; lots_of_threads < NUM_THREADS; lots_of_threads++) { res = pthread_create(&(a_thread[lots_of_threads]), NULL, thread_function, (void *)&lots_of_threads); if (res != 0) { perror("Thread creation failed"); exit(EXIT_FAILURE); } sleep(1); } printf("Waiting for threads to finish... "); for(lots_of_threads = NUM_THREADS - 1; lots_of_threads >= 0; lots_of_threads--) { res = pthread_join(a_thread[lots_of_threads], &thread_result); if (res == 0) { printf("Picked up a thread "); } else { perror("pthread_join failed"); } } printf("All done "); exit(EXIT_SUCCESS); } void *thread_function(void *arg) { int my_number = *(int *)arg; int rand_num; printf("thread_function is running. Argument was %d ", my_number); rand_num=1+(int)(9.0*rand()/(RAND_MAX+1.0)); sleep(rand_num); printf("Bye from %d ", my_number); pthread_exit(NULL); }
運行結果如下:
thread_function is running. Argument was 0 Bye from 0 thread_function is running. Argument was 1 thread_function is running. Argument was 2 Bye from 1 thread_function is running. Argument was 3 thread_function is running. Argument was 4 thread_function is running. Argument was 5 Waiting for threads to finish... Bye from 5 Picked up a thread Bye from 3 Bye from 2 Bye from 4 Picked up a thread Picked up a thread Picked up a thread Picked up a thread Picked up a thread All done了解更多
Posix多線程編程—線程屬性
參考資料《Linux 程序設計》
http://www.ibm.com/support/kn...
PS不得不承認,我失敗了。曾計劃每天分享一篇python相關知識點但沒有做到。失敗的原因想找可以找很多比如最近在做一個小的項目、這幾天出去聚會沒有時間、工作出現問題加班到比較晚等等,然而總結起來不外乎在心里它的重要程度是怎么樣的。我反思了下幾乎做到一天一篇的這一個月過程做出改變,不再要求一天一篇,而是當我有好的素材要分享時才分享,這樣與我與大家都是一件好事,我可以動態調度自己的精力和注意力,比如最近實現了一半的一個odoo項目依賴關系分析器可以盡快把它做完,對于讀者來說也可以減少干擾看到更好的分享而不是像我之前有幾篇那樣劃水的。但每周應該會有3-4篇Python的知識可以分享。另外我目前的工作是基于Odoo的,我計劃嘗試做一些基礎的教程來分享這個我熟悉的框架,如果有進展一定會告知感興趣的讀者。感謝讀者。
最后向漩渦鳴人致敬,朝他的“說到做到,這就是我的忍道”努力。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38241.html
摘要:一個簡單的語言實現的線程示例在看時,為了更好的理解線程的概念,書中列舉了這樣一個小例子將程序編譯鏈接后運行,可以看到下面這樣的結果這里使用創建新線程,的定義如下根據要求,只有一個指向的指針作為參數,返回的也是指向的指針。 一個簡單的C語言實現的線程示例 在看《Beginning Linux Programming》時,為了更好的理解線程的概念,書中列舉了這樣一個小例子: #inclu...
摘要:誕生之處就支持多線程,所以自然有解決這些問題的辦法,而且在編程語言領域處于領先地位。,線程規則這條是關于線程啟動的。在語言里面,的語義本質上是一種可見性,意味著事件對事件來說是可見的,無論事件和事件是否發生在同一個線程里。 之前我們說了:1,可見性2,原子性3,有序性3個并發BUG的之源,這三個也是編程領域的共性問題。Java誕生之處就支持多線程,所以自然有解決這些問題的辦法,而且在編...
摘要:基于的雙重檢查鎖定的解決方案對于前面的基于雙重檢查鎖定來實現延遲初始化的方案指示例代碼,我們只需要做一點小的修改把聲明為型,就可以實現線程安全的延遲初始化。 雙重檢查鎖定的由來 在java程序中,有時候可能需要推遲一些高開銷的對象初始化操作,并且只有在使用這些對象時才進行初始化。此時程序員可能會采用延遲初始化。但要正確實現線程安全的延遲初始化需要一些技巧,否則很容易出現問題。比如,下...
閱讀 1877·2021-11-19 09:40
閱讀 2594·2021-08-30 09:46
閱讀 2177·2021-08-03 14:01
閱讀 2648·2019-08-30 10:54
閱讀 1197·2019-08-29 16:38
閱讀 1440·2019-08-29 11:02
閱讀 2536·2019-08-28 18:16
閱讀 1679·2019-08-28 18:09