青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 0,  comments - 5,  trackbacks - 0
參考至http://sourceware.org/pthreads-win32/manual/index.html,其中包括pthread的win32,winc3實現(基本跨平臺)
pthread介紹:https://computing.llnl.gov/tutorials/pthreads/

基本接口介紹:
1.   pthread_create 

  #include <pthread.h>

   int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);

   創建一個由調用線程控制的新的線程并發運行。新的線程使用start_routine作為實現體,并以arg作為第一個參數。
   新的線程可以通過調用pthread_exit顯式結束,或者通過start_routine return來隱式結束。其中后者等價于調用pthread_exit并以start_routine 的返回值作為退出碼。
      新線程的初始信號狀態繼承自他的創建線程,并且沒有掛起的信號。pthread-win32暫時未實現信號量。
      attr參數指明新線程的屬性,如果attr=NULL,則使用默認屬性:新線程是joinable(not detached),和默認的調度策略(非實時)
     返回值:如果成功,新線程的指針會被存儲到thread的參數中,并返回0。如果錯誤則一個非0的錯誤碼返回。
      如果返回EAGAIN,沒有足夠的系統資源創建一個線程,或者已經存在大于PTHREAD_THREADS_MAX個活躍線程。

2. pthread_exit
   
#include <pthread.h>
   void pthread_exit(void *retval);
  
pthread_exit結束調用線程的執行.所有通過pthread_cleanup_push設置的清除句柄將會被反序執行(后進先出)。
 所以key值非空的線程特定數據Finalization functions被調用(參見pthread_key_create)。
  最后調用線程被終止。
  retval是這個線程結束的返回值,可以通過在別的線程中調用pthread_join來獲取這個值。
   沒有返回值。

3. pthread_join 
   #include <pthread.h>
   int pthread_join(pthread_t th, void **thread_return);   

   掛載一個在執行的線程直到該線程通過調用pthread_exit或者cancelled結束。
   如果thread_return不為空,則線程th的返回值會保存到thread_return所指的區域。
   th的返回值是它給pthread_exit的參數,或者是pthread_canceled 如果是被cancelled的。
   被依附的線程th必須是joinable狀態。一定不能是detached通過使用pthread_detach或者pthread_create中使用pthread_create_detached屬性。
   當一個joinable線程結束時,他的資源(線程描述符和堆棧)不會被釋放直到另一個線程對它執行pthread_join操作。
   如果成功,返回值存儲在thread_return中,并返回0,否則返回錯誤碼:
   ESRCH:找不到指定線程
   EINVAL:線程th是detached或者已經存在另一個線程在等待線程th結束
   EDEADLK:th的參數引用它自己(即線程不能join自身)

4.pthread_cancel   

  #include <pthread.h>
  int pthread_cancel(pthread_t thread);
  int pthread_setcancelstate(int state, int *oldstate);
  int pthread_setcanceltype(int type, int *oldtype);
  void pthread_testcancel(void);

   Cancellation是一種一個線程可以結束另一個線程執行的機制。更確切的說,一個線程可以發生Cancellation請求給另一個線程。
   根據線程的設置,收到請求的線程可以忽視這個請求,立即執行這個請求或者延遲到一個cancellation點執行。
   當一個線程執行Cancellation請求,相當于在那個點執行pthread_exit操作退出:所有cleanup句柄被反向調用,所有析構函數被調用結束線程并返回pthread_canceled.


5.pthread_cond   
   #include <pthread.h>
   pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
   int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
   int pthread_cond_signal(pthread_cond_t *cond);
   int pthread_cond_broadcast(pthread_cond_t *cond);
   int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
   int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
   int pthread_cond_destroy(pthread_cond_t *cond);

   
pthread_cond_init初始化條件變量,通過cond_attr,如果cond_attr是null則使用默認屬性。也可以通過常量PTHREAD_COND_INITIALIZER靜態初始化。
   pthread_cond_signal激活一個正在等待條件變量cond的線程。如果沒有線程在等待則什么也不會發生,如果有多個線程在等待,則只能激活一個線程,帶未指定是哪個線程(根據操作系統自己的調度策略選擇)。
   pthread_cond_broadcast激活所有在等待條件變量cond的線程。
   pthread_cond_wait自動解鎖mutex(pthread_unlock_mutex)等待條件變量cond發送。線程的執行被掛起不消耗cpu時間直到cond發送。在wait的入口mutex必須被鎖住。
   在重新回到線程前,pthread_cond_wait會重新獲得mutex(pthread_lock_mutex).解鎖mutex和掛起是自動進行的。因此,如果所有線程在發送cond前都申請mutex的話,
   這種wait的內部實現機制能夠保證在線程鎖住mutex和線程wait之間不會有cond發送操作發送。
   pthread_cond_timedwaitpthread_cond_wait,只是多了個超時設置,如果超時,則重新獲取mutex并且返回ETIMEDOUT,時間為絕對時間。
   pthread_cond_destroy銷毀一個條件變量。必須沒有線程在wait該條件變量。
   condition函數是異步信號不安全的,容易產生死鎖,必須自己控制調用流程避免死鎖。

6.semaphore
 #include <semaphore.h>
 int sem_init(sem_t *sem, int pshared, unsigned int value);
 int sem_wait(sem_t * sem);
 int sem_timedwait(sem_t * sem, const struct timespec *abstime);
 int sem_trywait(sem_t * sem);
 int sem_post(sem_t * sem);
 int sem_post_multiple(sem_t * sem, int number);
 int sem_getvalue(sem_t * sem, int * sval);
 int sem_destroy(sem_t * sem);

 sem_init:
初始化信號量,pshared表示該信號量是否只屬于當前進程(pshared==0),如果pshared不為0則表示可以在進程間共享。value表示該信號量的初始值。
  sem_wait:如果信號量的值大于0,則自動減1并立即返回。否則線程掛起直到sem_post或sem_post_multiple增加信號量的值。
  sem_timedwait:同sem_wait,只是多了個超時設置,如果超時,首先將全局變量errno設為ETIMEDOUT,然后返回-1.
  sem_trywait:如果信號量的值大于0,將信號量減1并立即返回,否則將全局變量errno設為ETIMEDOUT,然后返回-1。sem_trywait不會阻塞。
  sem_post:釋放一個正在等待該信號量的線程,或者將該信號量+1.
  sem_post_multiple:釋放多個正在等待的線程。如果當前等待的線程數n小于number,則釋放n個線程,并且該信號量的值增加(number - n).
  sem_get_value:返回信號量的值。在pthread-win32實現中,正值表示當前信號量的值,負值的絕對值表示當前正在等待該信號量的線程數。雖然在POSIX不需要這么表示,但是也是同樣含義。


  信號量(sem)與條件變量(cond)的主要差別在于,條件變量等待必須在發送之前,否則容易出現死鎖,而信號量等待可以在發送之后執行。一句話概括信號量對于操作的時序沒有要求。

幾個測試程序:
1.
#include <stdio.h>
#include 
<Windows.h>
#include 
"pthread.h"


pthread_mutex_t mutex 
= PTHREAD_MUTEX_INITIALIZER;/*初始化互斥鎖*/
pthread_cond_t cond 
= PTHREAD_COND_INITIALIZER;/*初始化條件變量*/

void *thread1(void *);
void *thread2(void *
);

int i=1
;
int main(void
)
{
    pthread_win32_process_attach_np();
    pthread_win32_thread_attach_np();

    pthread_t t_a;
    pthread_t t_b;

    pthread_create(
&t_a,NULL,thread2,(void *)NULL);/*創建進程t_a*/

    pthread_create(
&t_b,NULL,thread1,(void *)NULL); /*創建進程t_b*/
    pthread_join(t_b, NULL);
/*等待進程t_b結束*/
    pthread_mutex_destroy(
&mutex);
    pthread_cond_destroy(
&
cond);

    pthread_win32_thread_detach_np();
    pthread_win32_process_detach_np();

    system(
"pause"
);
    
return 0
;
}

void *thread1(void *
junk)
{
    
for(i=1;i<=9;i++

    {
        
        
if(i%3==0
)
        {
            pthread_mutex_lock(
&mutex);/*鎖住互斥量*/

            pthread_cond_signal(
&cond);/*條件改變,發送信號,通知t_b進程*/
            pthread_mutex_unlock(
&mutex);/*解鎖互斥量*/
        }
        
else        
            printf(
"thead1:%d\n"
,i);

    }

    
return
 NULL;
}

void *thread2(void *
junk)
{
    
while(i<9
)
    {
        
        
if(i%3!=0
)
        {
            pthread_mutex_lock(
&
mutex);
            pthread_cond_wait(
&cond,&mutex);/*等待*/

            pthread_mutex_unlock(
&mutex);
        }
        printf(
"thread2:%d\n"
,i);
        

    }

    
return
 NULL;
}
結果:
2.
#include <stdio.h>
#include 
<Windows.h>
#include 
"pthread.h"
#include 
<ctype.h>

typedef 
struct arg_set
{
    
char *
fname;
    
int
 count;
    
int
 tid;
}ARG_SET;

bool bWait = false
;
ARG_SET 
*mailbox =
 NULL;
pthread_mutex_t read_lock 
=
 PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t write_lock 
=
 PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t read_cond 
=
 PTHREAD_COND_INITIALIZER;
pthread_cond_t write_cond 
=
 PTHREAD_COND_INITIALIZER;


void main(int ac, char *
av[])
{
    pthread_win32_process_attach_np();
    pthread_win32_thread_attach_np();

    pthread_t t1, t2, t3;
    ARG_SET args1, args2, args3;
    
void *count_words(void *
);
    
int reports_in = 0
;
    
int total_words = 0
;

    
if (4 !=
 ac)
    {
        printf(
"usage: %s file1 file2 file3\n", av[0
]);
        
return
;
    }
    
    args1.fname 
= av[1
];
    args1.count 
= 0
;
    args1.tid 
= 1
;
    pthread_create(
&t1, NULL, count_words, (void *)&
args1);

    args2.fname 
= av[2
];
    args2.count 
= 0
;
    args2.tid 
= 2
;
    pthread_create(
&t2, NULL, count_words, (void *)&
args2);

    args3.fname 
= av[3
];
    args3.count 
= 0
;
    args3.tid 
= 3
;
    pthread_create(
&t3, NULL, count_words, (void *)&
args3);

    
while(reports_in < 3
)
    {
        printf(
"MAIN: waiting for flag to go up\n"
);
        pthread_mutex_lock(
&
read_lock);
        bWait 
= true
;
        pthread_cond_wait(
&read_cond, &
read_lock);
        bWait 
= false
;
        pthread_mutex_unlock(
&
read_lock);
        printf(
"MAIN: wow! flag was raised, I have the lock\n"
);

        printf(
"MAIN: %7d: %s\n", mailbox->count, mailbox->
fname);
        total_words 
+= mailbox->
count;

        Sleep(
10
);

        printf(
"MAIN: Ok, I've read the thread %d mail\n", mailbox->
tid);
        
        pthread_mutex_lock(
&
write_lock);
        pthread_cond_signal(
&
write_cond);
        pthread_mutex_unlock(
&
write_lock);
        printf(
"MAIN: raising write flag\n"
);

        reports_in
++
;
    }
    printf(
"%7d: total words\n"
, total_words);

    pthread_mutex_destroy(
&
read_lock);
    pthread_mutex_destroy(
&
write_lock);
    pthread_cond_destroy(
&
read_cond);
    pthread_cond_destroy(
&
write_cond);

    pthread_win32_thread_detach_np();
    pthread_win32_process_detach_np();

    system(
"pause"
);
}

void *count_words(void *
a)
{
    ARG_SET 
*args = (ARG_SET*
)a;
    FILE 
*
fp;
    
int c, prevc = '\0'
;

    
if (NULL != (fp = fopen(args->fname, "r"
)))
    {
        
while((c = getc(fp)) !=
 EOF)
        {
            
if (!isalnum(c) &&
 isalnum(prevc))
            {
                args
->count++
;
            }
            prevc 
=
 c;
        }
        fclose(fp);
    }
    
else

    {
        perror(args
->fname);
    }

    printf(
"COUNT %d: waiting to get lock\n", args->
tid);    
    
    
    pthread_mutex_lock(
&
write_lock);  
    
if (NULL !=
 mailbox)
    {
        printf(
"COUNT %d: oops..mailbox not empty. wait for signal\n", args->
tid);
        pthread_cond_wait(
&write_cond, &
write_lock);
    }

    printf(
"COUNT %d: OK, I can write mail\n", args->
tid);
    mailbox 
=
 args;  

    
    
while (!
bWait)
    {
        Sleep(
1
);        
    }
    pthread_mutex_lock(
&
read_lock); 
    pthread_cond_signal(
&read_cond);    /* raise the flag */

    pthread_mutex_unlock(
&read_lock); 

    printf(
"COUNT %d: raising read flag\n", args->
tid);


    pthread_mutex_unlock(
&write_lock);    /* release the mailbox */

    printf(
"COUNT %d: unlocking box\n", args->tid);    

    
return
 NULL;
}
結果:

3.

#include <stdio.h>
#include 
<Windows.h>
#include 
"pthread.h"
#include 
"semaphore.h"
#include 
<ctype.h>

typedef 
struct arg_set
{
    
char *fname;
    
int count;
    
int tid;
}
ARG_SET;

ARG_SET 
*mailbox = NULL;
static sem_t sem_write;
static sem_t sem_read;


void main(int ac, char *av[])
{
    pthread_win32_process_attach_np();
    pthread_win32_thread_attach_np();

    pthread_t t1, t2, t3;
    ARG_SET args1, args2, args3;
    
void *count_words(void *);
    
int reports_in = 0;
    
int total_words = 0;

    
if (4 != ac)
    
{
        printf(
"usage: %s file1 file2 file3\n", av[0]);
        
return;
    }


    
if (-1 == sem_init(&sem_read, 0 , 1)
        
|| -1 == sem_init(&sem_write, 00))
    
{
        
return;
    }


    args1.fname 
= av[1];
    args1.count 
= 0;
    args1.tid 
= 1;
    pthread_create(
&t1, NULL, count_words, (void *&args1);
    
    args2.fname 
= av[2];
    args2.count 
= 0;
    args2.tid 
= 2;
    pthread_create(
&t2, NULL, count_words, (void *&args2);
    
    args3.fname 
= av[3];
    args3.count 
= 0;
    args3.tid 
= 3;
    pthread_create(
&t3, NULL, count_words, (void *&args3);


    
while(reports_in < 3)
    
{
        printf(
"MAIN: waiting for sub thread write\n");
        sem_wait(
&sem_write);

        printf(
"MAIN: %7d: %s\n", mailbox->count, mailbox->fname);
        total_words 
+= mailbox->count;
        
if ( mailbox == &args1) 
            pthread_join(t1,NULL);
        
if ( mailbox == &args2) 
            pthread_join(t2,NULL);
        
if ( mailbox == &args3) 
            pthread_join(t3,NULL);
        
        mailbox 
= NULL;
        printf(
"MAIN: Ok,I have read the mail\n");
        sem_post(
&sem_read);  
        reports_in
++;
    }

   

    printf(
"%7d: total words\n", total_words);
    sem_destroy(
&sem_read);
    sem_destroy(
&sem_write);

    pthread_win32_thread_detach_np();
    pthread_win32_process_detach_np();

    system(
"pause");
}



void *count_words(void *a)
{
    
struct arg_set *args = (arg_set *)a;    /* cast arg back to correct type */
    FILE 
*fp;
    
int  c, prevc = '\0';
     
    
if ( (fp = fopen(args->fname, "r")) != NULL )
    
{
         
while( ( c = getc(fp)) != EOF )
         
{
               
if ( !isalnum(c) && isalnum(prevc) )
               
{
                    args
->count++;
               }

               prevc 
= c;
         }

         fclose(fp);
     }
 else 
          perror(args
->fname);
     printf(
"COUNT %d: waiting for main thread read the mail\n", args->tid);
     sem_wait(
&sem_read);
     printf(
"COUNT %d:OK,I can write mail\n", args->tid);
     mailbox 
= args;            /* put ptr to our args there */
     printf(
"COUNT %d: Finished writting\n", args->tid);
     sem_post(
&sem_write);
     
return NULL;
}


4.

posted on 2012-09-07 13:41 saha 閱讀(12343) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿

文章分類

文章檔案

收藏夾

搜索

  •  

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品视频免费一区| 久久久精品欧美丰满| 久久天堂av综合合色| 国产麻豆综合| 欧美中文字幕第一页| 一区二区三区日韩欧美精品| 欧美激情欧美狂野欧美精品 | 欧美视频精品一区| 亚洲图片欧洲图片日韩av| 亚洲人成小说网站色在线| 久色婷婷小香蕉久久| 欧美中文日韩| 在线看成人片| 欧美ed2k| 欧美激情在线| 欧美高清视频| 欧美日韩在线播放| 久久国产精品久久国产精品| 欧美视频精品在线观看| 亚洲精品国产品国语在线app| 影音国产精品| av成人免费在线| 国产色视频一区| 欧美国产日韩a欧美在线观看| 欧美激情视频在线免费观看 欧美视频免费一 | 久久婷婷国产综合尤物精品| 久久综合色婷婷| 99热在线精品观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 免费亚洲婷婷| 亚洲一级二级| 久久精品五月| 女女同性精品视频| 91久久精品国产91性色tv| 亚洲激情成人网| 国产精品久久久久久久免费软件| 久久久久久精| 国产精品扒开腿爽爽爽视频| 久久综合九色综合欧美狠狠| 韩日欧美一区| 亚洲天堂av图片| ●精品国产综合乱码久久久久| 久久久国产午夜精品| 欧美成人亚洲成人日韩成人| 亚洲免费高清| 久久精品亚洲精品| 亚洲成色999久久网站| 国产精品av久久久久久麻豆网| 一本久久综合亚洲鲁鲁| 欧美在线看片a免费观看| 国产一区二区三区电影在线观看| 一区二区三区免费在线观看| 亚洲嫩草精品久久| 欧美激情视频在线免费观看 欧美视频免费一 | 国产热re99久久6国产精品| 一本色道久久综合亚洲精品小说 | 欧美一区亚洲一区| 亚洲高清不卡av| 狠狠色狠狠色综合| 女人天堂亚洲aⅴ在线观看| 日韩亚洲欧美综合| 亚洲精品视频在线| 老妇喷水一区二区三区| 亚洲乱码视频| 一区二区三区产品免费精品久久75 | 久久综合99re88久久爱| 99在线精品视频| 国产午夜精品久久| 欧美精品手机在线| 欧美一级久久久| 久久久国产精品一区| 99re6这里只有精品| 国产日韩精品在线播放| 欧美国产精品劲爆| 亚洲韩国日本中文字幕| 91久久综合亚洲鲁鲁五月天| 国产精品户外野外| 中文国产成人精品| 性xx色xx综合久久久xx| 国产精品任我爽爆在线播放| 久久亚洲国产成人| 午夜影视日本亚洲欧洲精品| 亚洲一区二区三区久久 | 国产在线精品二区| 久久久精品日韩欧美| aa级大片欧美三级| 亚洲第一天堂av| 毛片一区二区| 久久精品二区三区| 1024成人| 国产真实久久| 国产精品久久精品日日| 欧美福利视频| 久久一区二区三区国产精品| 亚洲欧美日韩精品久久| 久久久国产精品一区| 亚洲综合国产| 韩国一区电影| 国产日韩欧美一区二区三区四区| 欧美激情亚洲另类| 免费永久网站黄欧美| 久久久国产精品亚洲一区 | 亚洲一区二区三区乱码aⅴ| 亚洲精品中文字幕有码专区| 亚洲欧洲精品一区二区三区| 亚洲电影免费观看高清完整版在线观看 | 欧美激情综合网| 免费亚洲婷婷| 欧美好骚综合网| 欧美大香线蕉线伊人久久国产精品| 99riav国产精品| 亚洲欧洲视频| 亚洲精品一区二区在线| 亚洲每日在线| 在线综合欧美| 亚洲欧美日本国产有色| 欧美不卡在线视频| 欧美激情精品久久久久久大尺度| 免费欧美在线视频| 亚洲第一页自拍| 亚洲人成在线影院| 一级日韩一区在线观看| 亚洲影视中文字幕| 亚洲黄色在线视频| 99精品欧美| 亚洲综合社区| 久久久xxx| 欧美国产免费| 国产精品国产自产拍高清av王其| 国产精品日韩久久久| 韩国成人福利片在线播放| 亚洲国产精品久久久久婷婷884 | 蜜臀久久99精品久久久画质超高清| 久久尤物视频| 亚洲激情第一页| 亚洲视频欧美视频| 久久国产一区| 亚洲永久精品大片| 欧美中日韩免费视频| 欧美成人午夜视频| 国产精品久久久久久久9999 | 亚洲午夜一区| 久久久最新网址| 久久成人国产精品| 欧美福利电影网| 亚洲天堂男人| 老司机免费视频一区二区| 欧美三级日本三级少妇99| 好吊色欧美一区二区三区视频| 亚洲日韩欧美视频| 久久高清免费观看| 亚洲欧洲在线观看| 欧美影视一区| 欧美日韩亚洲另类| 亚洲电影毛片| 久久国产精品久久久久久电车| 欧美大片一区| 欧美在线二区| 欧美私人啪啪vps| 亚洲激情亚洲| 日韩一区二区福利| 久久久www成人免费精品| 欧美黑人国产人伦爽爽爽| 亚洲一区日韩| 欧美日韩国产小视频在线观看| 欧美国产大片| 精品1区2区| 亚洲国产裸拍裸体视频在线观看乱了| 中文网丁香综合网| 亚洲高清久久久| 久久国产欧美精品| 国产精品久久国产精品99gif| 在线观看成人小视频| 欧美一区二区| 久久免费一区| 亚洲影院色无极综合| 欧美日韩一二区| 亚洲精品久久久久久下一站| 久热国产精品| 久久国产成人| 国产综合色在线| 欧美一区二区高清| 亚洲午夜一二三区视频| 欧美日韩高清在线| 亚洲毛片av| 亚洲欧洲精品一区二区| 蜜臀久久久99精品久久久久久| 欧美日韩激情网| 日韩一区二区免费看| 亚洲国产一区二区三区高清| 狼人天天伊人久久| 在线观看欧美日本| 美女脱光内衣内裤视频久久网站| 欧美一级二级三级蜜桃| 国产日产欧产精品推荐色 | 中文高清一区| 一区二区免费看| 欧美三区美女| 午夜精品久久久久久久99水蜜桃| 久久亚洲精选|