2009年5月6日 星期三

在DEV-C++執行的 pthread_cancel程式範例 與 【C&C++程式設計實務基礎班】上課實作(CODING)完成的全部範例( 67 LAB範例 )

昨天星期三晚,剛結束自強的【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)。


2 則留言:

  1. 江老師,請教一下 你的著作C&C++完美精典跟另一本C&C++完美演譯,差別在哪?
     
     

    回覆刪除
  2. C&C++完美演繹一書早期的作者是我,但現在我發現該書名目前由 松橋工作室 出版囉,那就不是我囉^^
    您手上該書的作者是誰?

    回覆刪除

FPGA Verilog 的學習經驗,提供給要入門的新手

今天簡單說說 FPGA Verilog 的學習經驗,提供給要入門的新手: 1.對自己寫的FPGA Verilog程式,所生成的數位電路要心中有數。 這一點個人認為很重要,就正如寫 C語言,心中要能生成對應的組合語言一樣,我是這樣要求自己的。 雖然 FPGA Verilog語言...