今天得知了參加的最後一場暑期實習生的招聘結果,我又被刷了,沮喪了幾天之後,有人告訴我那家公司不招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.
在我們進一步學習線程同步前,一定要記住這些函數(@_@)