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

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 閱讀(12342) 評論(0)  編輯 收藏 引用

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



<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿

文章分類

文章檔案

收藏夾

搜索

  •  

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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一区二区| 日韩亚洲视频在线| 亚洲免费观看在线观看| 久久嫩草精品久久久精品一| 亚洲欧洲日本国产| 欧美日韩成人一区二区| 亚洲欧美中文另类| 久久电影一区| 99在线视频精品| 亚洲视频一二| 精品1区2区3区4区| 最新国产乱人伦偷精品免费网站| 欧美精品自拍| 久久在线精品| 欧美午夜理伦三级在线观看| 久久婷婷久久| 欧美午夜久久久| 91久久黄色| 国产一区二区观看| 在线一区二区视频| 亚洲免费观看| 麻豆国产精品777777在线| 香蕉久久一区二区不卡无毒影院| 麻豆精品网站| 男女精品网站| 国产日韩欧美| 亚洲在线观看免费| 亚洲精品日韩精品| 久久久久久69| 久久九九免费视频| 国产精品婷婷午夜在线观看| 亚洲二区三区四区| 国模私拍一区二区三区| 亚洲免费一级电影| 欧美亚洲综合网| 国产亚洲精品成人av久久ww| 永久域名在线精品| 久久精品免费电影| 麻豆九一精品爱看视频在线观看免费 | 国产午夜久久| 久久国产精品色婷婷| 老司机aⅴ在线精品导航| 国产欧美另类| 久久久中精品2020中文| 亚洲国产精品福利| 99国产成+人+综合+亚洲欧美| 久久亚洲电影| 9国产精品视频| 亚洲欧美国产高清| 一区二区三区在线观看国产| 久久久夜夜夜| 日韩午夜免费视频| 免费欧美高清视频| 亚洲一区二区毛片| 一区在线观看| 国产精品久久久久久久久免费| 香蕉久久a毛片| 亚洲精品在线看| 玖玖综合伊人| 老司机午夜精品视频在线观看| 久久99伊人| 久久免费99精品久久久久久| 精品不卡在线| 国产精品va在线| 欧美a级在线| 欧美在线综合视频| 99精品热6080yy久久| 欧美成人首页| 蜜桃久久av一区| 欧美一级视频免费在线观看| 亚洲国产岛国毛片在线| 欧美婷婷久久| 欧美日韩p片| 欧美亚洲专区| 亚洲欧美国产毛片在线| 亚洲国产欧美不卡在线观看| 国产精品一区二区久激情瑜伽| 久久伊伊香蕉| 老**午夜毛片一区二区三区| 性欧美videos另类喷潮| 正在播放欧美视频| 亚洲午夜高清视频| 亚洲一本视频| 午夜久久99| 久久久久久日产精品| 久久一区二区三区国产精品| 久久久久国产免费免费| 久久午夜电影网| 欧美成人免费网站| 欧美视频中文在线看 | 亚洲午夜国产成人av电影男同| 精久久久久久久久久久| 亚洲国产欧美一区二区三区久久| 亚洲第一久久影院| 亚洲日本无吗高清不卡| 亚洲一区二区在线看| 欧美一区二区视频在线观看| 久久综合给合久久狠狠狠97色69| 欧美暴力喷水在线| 亚洲一二三四久久| 女女同性精品视频| 国产精品日日摸夜夜摸av| 国内精品久久久久久久影视麻豆 | 在线一区欧美| 老司机免费视频一区二区三区| 亚洲激情成人| 久久国产精品一区二区| 欧美人成在线视频| 极品少妇一区二区三区| 亚洲综合丁香| 99精品99久久久久久宅男| 99视频日韩| 欧美96在线丨欧| 国产视频久久| 欧美一区观看| 一区二区三区四区五区在线| 久久综合中文| 永久91嫩草亚洲精品人人| 欧美在线免费视频| 亚洲一区二区三区中文字幕在线| 免费看的黄色欧美网站| 欧美伦理影院| 亚洲私人黄色宅男| 亚洲天堂av在线免费| 欧美日韩成人精品| 中文亚洲欧美| 在线亚洲美日韩| 国产一区二区久久久| 你懂的视频一区二区| 亚洲欧美精品中文字幕在线| 日韩一级裸体免费视频| 国产精品美女诱惑| 久久国产欧美精品| 久久精品人人爽| 亚洲精品极品| 国产精品99久久久久久宅男| 国产精品久久激情| 久久久久久有精品国产| 久久婷婷麻豆| 午夜久久一区| 免费成人高清| 亚洲欧美日韩在线| 久久一二三四| 欧美一区二区视频在线观看2020| 欧美一区二区三区精品电影| 在线欧美影院| 亚洲视频在线免费观看| 一区精品在线播放| 在线视频亚洲| 91久久夜色精品国产九色| 中文一区二区在线观看| 免费欧美在线视频| 国产精品美女久久久久av超清| 免费久久久一本精品久久区| 国产精品久久久久77777| 一本一本久久| 欧美精品三区| 亚洲国产精品电影在线观看| 免费在线亚洲| 久色婷婷小香蕉久久| 国产精品视频一区二区三区| 亚洲国产精品成人| 伊人久久亚洲热| 久久精品综合网| 久久在线免费视频| 精品不卡一区| 美女精品在线| 亚洲第一福利社区| 亚洲精品一区二区三区四区高清 | 亚洲激情专区| 亚洲精品在线看| 欧美丰满少妇xxxbbb| 亚洲精品影视在线观看| 亚洲午夜国产成人av电影男同| 欧美系列亚洲系列| 欧美一乱一性一交一视频| 久久久久久久久久久一区| 伊人成综合网伊人222| 美女视频黄a大片欧美| 亚洲国产日本| 午夜精品福利电影| 国产综合色产在线精品| 免费一级欧美片在线观看| 亚洲免费大片| 久久国产精品久久w女人spa| 一区二区三区中文在线观看| 欧美日韩午夜激情| 欧美在线3区| 亚洲一区二区黄| 亚洲国产精品va在线看黑人| 欧美在线视频免费观看| 欧美午夜不卡影院在线观看完整版免费| 中日韩男男gay无套| 亚洲黄色大片| 欧美大胆a视频| 久久亚洲精品视频| 久久成人资源| 亚洲欧美日韩中文播放| 一本色道久久综合狠狠躁篇怎么玩| 国产亚洲人成a一在线v站|