建立執行緒
#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.乙個棧空間...