線程初識+六個函數

今天得知了參加的最後一場暑期實習生的招聘結果,我又被刷了,沮喪了幾天之後,有人告訴我那家公司不招c/c++方向的,還有半個月就放暑假了,是繼續看書學習,還是去實踐,很迷茫,真的感覺時間不夠用。

這篇用來記錄線程,幾個星期之前,我看過這篇,當時理解記憶了,可是今天回過頭來再看,感覺還是記不清楚,可能是沒有系統的總結吧。這篇就總結一下:

#include <pthread.h>
int pthread_equal(pthread_t t1, pthread_t t2);
pthread_t pthread_self(void);
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);

Compile and link with -pthread.(第一次線程程序時總是出錯,後來看文檔發現有這句話,所以文檔永遠是最好的書籍)上面的三個函數,我個人覺得第三個當然時最重要的,重點解讀一下:

pthread_t   *thread:存儲創建的新線程的ID

const pthread_attr_t *attr:定製線程屬性

void *(*start_routine) (void *):函數指針,新線程從start_routine開始運行

void *arg:如果需要向上面的函數傳遞多個參數,可以採用結構體,把地址作爲arg參數傳入


程序如下:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void print(const char*s)
{
    pid_t pid;
    pthread_t tid;
    pid=getpid();
    tid=pthread_self();
    printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid, (unsigned int)
            tid,(unsigned int)tid);

}
void *thr_fn(void *args)
{
    print("new thread:");
    return ((void*)0);
}

int main()
{
    pthread_t ntid;
int err;
    err=pthread_create(&ntid, NULL,thr_fn,NULL);
    print("main_thread:");
    sleep(1);
    exit(0);
}


我們先記住線程可以在不終止整個進程的情況下通過以下方式退出:

(1)只是從啓動例程返回,返回值時退出碼,如:return

(2)調用pthread_exit,和第一條類似

(3)被同一進程的其他線程取消

下面看另外三個函數:


#include <pthread.h>
void pthread_exit(void *retval)
int pthread_join(pthread_t thread, void **retval)
int pthread_cancel(pthread_t thread)


第一個函數返回退出碼,第二個函數取出特定線程的退出碼,線程沒退出,該函數將一直阻塞

程序如下:

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void *thr_fn1()
{
    printf("thread1 is returning\n");
    return ((void*)1);
}
void *thr_fn2()
{
    printf("thread2 is exiting\n");
    pthread_exit ((void*)2);
}

void main()
{
    int err;
    pthread_t tid1, tid2;
    void *tret;
    
    err=pthread_create(&tid1, NULL, thr_fn1,NULL);
if(err != 0)
        printf("create thread1 error\n");
    err=pthread_create(&tid2, NULL, thr_fn2,NULL);
    if(err != 0)
        printf("create thread2 error\n");
    err=pthread_join(tid1, &tret);
    if(err != 0)
        printf("can't join thread1\n");
    printf("thread 1 exit code %d\n",(int)tret);
    err=pthread_join(tid2, &tret);
    if(err != 0)
        printf("can't join thread2\n");
    printf("thread 2 exit code %d\n",(int)tret);
    exit(0);
}

至於pthread_cancel取決於cancelability state and type.

在我們進一步學習線程同步前,一定要記住這些函數(@_@)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章