昨天星期三晚,剛結束自強的【C&C++程式設計實務基礎班】課程,一般我都會在上課時依照投影片講解理論及語法後,再即刻寫出範例,讓學生可以自其中了解程式架構及理論與實際程式的關係。經過30小時後,這一班課程已經結束,再來就是邁向進階班C++課程。這次C語言的基礎課程的實作部份,每一個範例我均寫在一個目錄內,該目錄名稱都以該範例相關內容命名,例如:講解執行緒的Cancel問題,就命名為 pThreadCancel 。OK^^,下面這張圖是這一班課程上實作的LAB範例,整個課程共作了 67 個LAB喔。
程式碼如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_t th_id1, th_id2;
void* thr_fn1(void* arg)
{
int n1;
for( n1=0;n1<10;n1++ )
{
if( n1 == 3 )
printf( "==Cancel th_id2=%d ==", pthread_cancel( th_id2 ) );
printf("thr_fn1 ");
_sleep( 1000 );
}
printf("\nthread 1 returning\n");
return((void *)1);
}
void* thr_fn2(void* arg)
{
int n1;
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
for( n1=0;n1<10;n1++)
{
printf("thr_fn2 ");
_sleep( 1000 );
}
printf("\nthread 2 exiting\n");
pthread_exit((void *)2);
}
int main(void)
{
int err, n1;
void *tret;
err = pthread_create(&th_id1, NULL, thr_fn1, NULL);
if (err != 0)
printf("Can't create thread 1: %s\n", strerror(err));
err = pthread_create(&th_id2, NULL, thr_fn2, NULL);
if (err != 0)
printf("Can't create thread 2: %s\n", strerror(err));
err = pthread_join(th_id1, &tret);
if (err != 0)
printf("Can't join with thread 1: %s\n", strerror(err));
printf("\nthread 1 exit code %d\n", (int)tret);
err = pthread_join(th_id2, &tret);
if (err != 0)
printf("Can't join with thread 2: %s\n", strerror(err));
printf("thread 2 exit code %d\n", (int)tret);
//============== main thread ==============
for( n1=0;n1<10;n1++)
{
printf("main ");
_sleep( 1000 );
}
system( "PAUSE" );
return 0;
}
程式執行的畫面, 畫面中的《 thr_fu1 thr_fu2》是同時出現,隔約一秒後再印出 《 thr_fu1 thr_fu2》,這代表 thr_fn1與thr_fn2函數同時執行,而在 thr_fn1 執行到 n1=3時呼叫了 pthread_cancel( th_id2 ),將 th_id2 執行緒2 Cancel掉。th_id2 執行緒2 被Cancel,其 pthread_join(th_id2, &tret); 的接收執行緒2傳回值是 -1(PTHREAD_CANCELED)。
江老師,請教一下 你的著作C&C++完美精典跟另一本C&C++完美演譯,差別在哪?
回覆刪除C&C++完美演繹一書早期的作者是我,但現在我發現該書名目前由 松橋工作室 出版囉,那就不是我囉^^
回覆刪除您手上該書的作者是誰?