Linux多執行緒

2021-09-02 20:20:50 字數 4583 閱讀 3346

建立執行緒

#include

int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,void *(*start_rtn)(void),void *arg)

tidp:執行緒id

attr:執行緒屬性(通常為空)

start_rtn:執行緒要執行的函式

arg:start_rtn的引數

編譯的時候需要加上pthread的庫

gcc test.c -lpthread -o test

**:建立執行緒

#include #include void *mythread1(void)

}void *mythread2(void)

}int main()

/*建立執行緒2*/

ret = pthread_create(&id2, null, (void*)mythread2, null);

if (ret)

pthread_join(id1, null);

pthread_join(id2, null);

return 0;

}

向執行緒函式傳遞乙個整型的引數

#include #include #include void *create(void *arg)

int main(int argc ,char *argv)

sleep(1);

printf("pthread_create is created ...\n");

return 0;

}

有個share**

#include #include #include int a = 1;

void *create(void *arg)

int main(int argc,char *argv)

sleep(1);

printf("new thread is created ... \n");

return 0;

}

觀察兩次列印出來的a的值。第一次列印出a的值是5(棧),第二次是執行緒裡的a值(資料段的資料),也是全域性變數的值,應該是1。

當有全域性變數和區域性變數名相同時,首先應該呼叫區域性變數的值。區域性變數個全域性變數都儲存在棧中。

終止執行緒

如果程序中任何乙個執行緒中呼叫exit或_exit,那麼整個程序都會終止。執行緒的正常退出方式有:

執行緒從啟動例程中返回

執行緒可以被另乙個程序終止

執行緒自己呼叫pthread_exit函式

執行緒退出

#include

void pthread_exit(void* rval_ptr)

功能:終止呼叫執行緒

rval_ptr:執行緒退出返回值的指標

#include #include #include void *create(void *arg)

int main(int argc,char *argv)

error = pthread_join(tid, &temp);

if( error )

printf("thread is exit code %d \n", (int )temp);

return 0;

}

使用return 來終止執行緒程式

等待

#include

int pthread_join(pthread_t tid,void **rval_ptr)

功能:阻塞呼叫執行緒,直到指定的執行緒終止

tid:等待退出的執行緒id

rval_ptr:執行緒退出的返回值的指標

#include #include #include void *thread(void *str)

return null;

}int main()

return 0;

}

清除

執行緒終止有兩種情況:正常終止和非正常終止。執行緒主動呼叫pthread_exit或者從執行緒函式中return都將使執行緒正常退出,這是可預見的退出方式;非正常終止是執行緒在其他執行緒的干預下,或者由於自身執行出錯(比如訪問非法位址)而退出,這種退出方式是不可預見的。

但是這兩種終止都存在資源釋放問題,如何保證執行緒終止時能順利釋放掉自己所占用的資源,是乙個必須考慮解決的問題。

從pthread_cleanup_push的呼叫點到pthread_cleanup_pop之間的程式段中的終止動作(包括呼叫pthread_exit()和異常終止,不包括return)都將執行pthread_cleanup_push()所指定的清理函式。

#include

void pthread_cleanup_push(void (*rtn)(void *),void *arg)

功能:將清除函式壓入清除棧

rtn:清除函式

arg:清除函式的引數

void pthread_cleanup_pop(int execute)

將清除函式彈出清除棧

引數:execute執行到pthread_cleanup_pop()時是否在彈出清理函式的同時執行該函式,非0:執行;0:不執行

#include #include #include void *clean(void *arg)

void *thr_fn1(void *arg)

pthread_cleanup_pop(0);

pthread_cleanup_pop(0);

return (void *)1;

}void *thr_fn2(void *arg)

pthread_cleanup_pop(0);

pthread_cleanup_pop(0);

pthread_exit((void *)2);

}int main(void)

err=pthread_create(&tid2,null,thr_fn2,(void *)1);

if(err!=0)

err=pthread_join(tid1,&tret);

if(err!=0)

printf("thread 1 exit code %d \n",(int)tret);

err=pthread_join(tid2,&tret);

if(err!=0)

printf("thread 2 exit code %d \n",(int)tret);

return 1;

}

執行緒1和執行緒2分別列印出什麼

thread 1 start

thread 1 push complete

因為執行緒1有return終止,將不執行push與pop之間的清除函式

thread 2 start

thread 2 push complete

cleanup :thread 2 second handler (後壓入棧中,先彈出)

cleanup :thread 2 first handler

這篇文章寫得很好:

下面是我寫乙個建立多執行緒的例子,使用crtl+c可以順序退出執行緒

在linux中輸入: g++ test.cpp -lpthread -o test 編譯

#include #include #include #include #include #include #include #include #include #include using namespace std;

int num=0;

pthread_mutex_t mutex = pthread_mutex_initializer;

int flag = -1;

int getinput()

return c;

}int num_max=0;

void *thread(void *arg)

} sleep(1);

pthread_mutex_lock(&mutex);

num++;

printf("my thread%d:num=%d,pid=%ld \n",i,num,pthread_self());

pthread_mutex_unlock(&mutex);

} printf("thread%d exit\n",i);

return (void*)0;

}void sighandler(int signum)

int main(int argc,char *argv)

} signal(sigint, sighandler);

for(int i=0;ipthread_mutex_destroy(&mutex);

free(id);

free(pt);

return 0;

}

linux多執行緒

linux下為了多執行緒同步,通常用到鎖的概念。posix下抽象了乙個鎖型別的結構 ptread mutex t。通過對該結構的操作,來判斷資源是否可以訪問。顧名思義,加鎖 lock 後,別人就無法開啟,只有當鎖沒有關閉 unlock 的時候才能訪問資源。它主要用如下5個函式進行操作。1 pthre...

linux多執行緒

執行緒標識 就像每個程序都有乙個id一樣,執行緒也有自己的id。程序id用pid t來表示,他是乙個unsigned int。程序id用pthread t來表示,pthread t不能把它當整數處理。程序可以通過pthread self 函式獲得自身的執行緒id。執行緒建立 在程序中只有乙個控制線程...

Linux多執行緒

一 執行緒的特點 1.執行緒是程序的乙個執行流,是cpu排程和分配的基本單位。執行緒是程式執行的最小單位。2.執行緒不會影響到其它執行緒的執行。比如乙個執行緒崩潰,其它執行緒正常執行。3.同一程序內的執行緒共享程序的位址空間。二 乙個執行緒的組成 1.乙個指向當前被執行指令的指令指標 2.乙個棧空間...