Linux下線程編程(2)
線程(英語:thread)是操作系統(tǒng)能夠進行運算調(diào)度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。在Unix System V及SunOS中也被稱為輕量進程(lightweight processes),但輕量進程更多指內(nèi)核線程(kernel thread),而把用戶線程(user thread)稱為線程。
?1.6 線程取消函數(shù)pthread_cancel
int pthread_cancel(pthread_t thread);
函數(shù)功能:
??取消同一進程中的其他線程。
形 參:
??pthread_t thread — 線程描述符
返回值: 0 — 成功,其他值 — 失敗
??示例:
#include
#include
#include
void *start_routine_func(void *arg)
{
int data=*(int *)arg;
while(1)
{
printf("data=%d\n",data);
sleep(1);
data++;
}
}
int main()
{
int data=10;
pthread_t pth_id;
if(pthread_create(&pth_id,NULL,start_routine_func,&data)!=0)
{
printf("線程創(chuàng)建失敗\n");
return 0;
}
printf("子線程ID:%lu\n",pth_id);
while(1)
{
sleep(1);
printf("主線程運行中data=%d\n",data);
data++;
if(data==15)
{
pthread_cancel(pth_id);//取消子線程
}
}
}
[xsw@xsw 系統(tǒng)編程]$ gcc pthread.c -lpthread
[xsw@xsw 系統(tǒng)編程]$ ./a.out
子線程ID:3079162736
data=10
主線程運行中data=10
data=11
主線程運行中data=11
data=12
主線程運行中data=12
data=13
主線程運行中data=13
data=14
主線程運行中data=14
主線程運行中data=15
主線程運行中data=16
主線程運行中data=17
1.7 線程分離屬性pthread_detach
創(chuàng)建一個線程默認(rèn)的狀態(tài)是joinable(結(jié)合屬性),如果一個線程結(jié)束但沒有調(diào)用pthread_join,則它的狀態(tài)類似于進程中的zombie process(僵尸進程),即還有一部分資源沒有被回收(退出狀態(tài)碼),所以創(chuàng)建線程時應(yīng)該使用函數(shù)pthread_join來等待線程運行結(jié)束,并可得到線程的退出代碼,回收其資源(類似進程中的wait、waitpid)。但是調(diào)用pthread_join(pthread_id)函數(shù)后,如果該線程沒有運行結(jié)束,調(diào)用者會被阻塞,有些情況下我們并不希望如此。 pthread_detach函數(shù)可以將該線程狀態(tài)設(shè)置為detached(分離狀態(tài)),則該線程運行結(jié)束后自動會釋放所有資源。
??函數(shù)原型:
int pthread_detach(pthread_t thread);
形 參:
??pthread_t thread — 線程標(biāo)志符
返回值: 0 — 成功,其它值 – 失敗
??示例:
#include
#include
#include
void *start_routine_func(void *arg)
{
int data=*(int *)arg;
while(1)
{
printf("data=%d\n",data);
sleep(1);
data++;
}
}
int main()
{
int data=10;
pthread_t pth_id;
if(pthread_create(&pth_id,NULL,start_routine_func,&data)!=0)
{
printf("線程創(chuàng)建失敗\n");
return 0;
}
printf("子線程ID:%lu\n",pth_id);
//設(shè)置分離屬性
pthread_detach(pth_id);
//等待子線程退出
pthread_join(pth_id,NULL);//未設(shè)置分離屬性則會阻塞主線程
while(1)
{
sleep(1);
printf("主線程運行中...\n");
}
return 0;
}
[xsw@xsw 系統(tǒng)編程]$ gcc pthread.c -lpthread
[xsw@xsw 系統(tǒng)編程]$ ./a.out
子線程ID:3078335344
data=10
主線程運行中...
data=11
主線程運行中...
data=12
主線程運行中...
data=13
主線程運行中...
data=14
主線程運行中...
data=15
1.8 設(shè)置線程??臻g
??查看線程堆??臻g:
[wbyq@wbyq ~]$ ulimit -s
8192
??8192單位是KB,也就是默認(rèn)??臻g大小為8M
??通過命令ulimit -a查看線程棧空間詳細(xì)信息
[wbyq@wbyq ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15407
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 15407
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
??通過命令ulimit -s ?臻g大小>
[wbyq@wbyq ~]$ ulimit -s 10240
[wbyq@wbyq ~]$ ulimit -s
10240
??每個線程的??臻g都是獨立的,如果堆棧空間溢出程序會出現(xiàn)段錯誤。如果一個進程有10個線程,那么分配的??臻g大小為10*<每個線程棧空間大小>
??示例:
#include
int main()
{
char buff[12*1024*1024+1]="hello,world\n";
printf("buff=%s,%d",buff,sizeof(buff));
return 0;
}
[xsw@xsw 系統(tǒng)編程]$ ./a.out
段錯誤 (core dumped)
?1.9 通過函數(shù)設(shè)置和查詢線程??臻g
#include
#include
#include
int main()
{
/*查看線程??臻g最小值*/
printf("STACK_MIN:%d\n",PTHREAD_STACK_MIN);//16384byte--16kb
pthread_attr_t attr;
size_t ret,stack_size;
ret=pthread_attr_init(&attr);//初始化線程屬性
if(ret!=0)
{
printf("初始化失敗\n");
return 0;
}
/*獲取線程??臻g*/
ret=pthread_attr_getstacksize(&attr,&stack_size);
printf("線程??臻g:%ld kb\n",stack_size/1024);
/*設(shè)置線程??臻g*/
stack_size=8*1024*1024;//8M
pthread_attr_setstacksize(&attr,stack_size);
/*獲取線程棧空間*/
ret=pthread_attr_getstacksize(&attr,&stack_size);
printf("修改后??臻g:%ld kb\n",stack_size/1024);
}
[wbyq@wbyq ubuntu]$ gcc main.c -pthread
[wbyq@wbyq ubuntu]$ ./a.out
STACK_MIN:16384
線程??臻g:10240 kb
修改后??臻g:8192 kb
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209538 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62631 -
線程編程
+關(guān)注
關(guān)注
0文章
5瀏覽量
6130
發(fā)布評論請先 登錄
相關(guān)推薦
評論