电子说
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
int pthread_cancel(pthread_t thread);
函数功能:
取消同一进程中的其他线程。
形 参:
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("线程创建失败\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 系统编程]$ gcc pthread.c -lpthread
[xsw@xsw 系统编程]$ ./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
创建一个线程默认的状态是joinable(结合属性),如果一个线程结束但没有调用pthread_join,则它的状态类似于进程中的zombie process(僵尸进程),即还有一部分资源没有被回收(退出状态码),所以创建线程时应该使用函数pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源(类似进程中的wait、waitpid)。但是调用pthread_join(pthread_id)函数后,如果该线程没有运行结束,调用者会被阻塞,有些情况下我们并不希望如此。 pthread_detach函数可以将该线程状态设置为detached(分离状态),则该线程运行结束后自动会释放所有资源。
函数原型:
int pthread_detach(pthread_t thread);
形 参:
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("线程创建失败\n");
return 0;
}
printf("子线程ID:%lu\n",pth_id);
//设置分离属性
pthread_detach(pth_id);
//等待子线程退出
pthread_join(pth_id,NULL);//未设置分离属性则会阻塞主线程
while(1)
{
sleep(1);
printf("主线程运行中...\n");
}
return 0;
}
[xsw@xsw 系统编程]$ gcc pthread.c -lpthread
[xsw@xsw 系统编程]$ ./a.out
子线程ID:3078335344
data=10
主线程运行中...
data=11
主线程运行中...
data=12
主线程运行中...
data=13
主线程运行中...
data=14
主线程运行中...
data=15
查看线程堆栈空间:
[wbyq@wbyq ~]$ ulimit -s
8192
8192单位是KB,也就是默认栈空间大小为8M
通过命令ulimit -a查看线程栈空间详细信息
[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 <栈空间大小>
[wbyq@wbyq ~]$ ulimit -s 10240
[wbyq@wbyq ~]$ ulimit -s
10240
每个线程的栈空间都是独立的,如果堆栈空间溢出程序会出现段错误。如果一个进程有10个线程,那么分配的栈空间大小为10*<每个线程栈空间大小>
示例:
#include
int main()
{
char buff[12*1024*1024+1]="hello,world\n";
printf("buff=%s,%d",buff,sizeof(buff));
return 0;
}
[xsw@xsw 系统编程]$ ./a.out
段错误 (core dumped)
#include
#include
#include
int main()
{
/*查看线程栈空间最小值*/
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;
}
/*获取线程栈空间*/
ret=pthread_attr_getstacksize(&attr,&stack_size);
printf("线程栈空间:%ld kb\n",stack_size/1024);
/*设置线程栈空间*/
stack_size=8*1024*1024;//8M
pthread_attr_setstacksize(&attr,stack_size);
/*获取线程栈空间*/
ret=pthread_attr_getstacksize(&attr,&stack_size);
printf("修改后栈空间:%ld kb\n",stack_size/1024);
}
[wbyq@wbyq ubuntu]$ gcc main.c -pthread
[wbyq@wbyq ubuntu]$ ./a.out
STACK_MIN:16384
线程栈空间:10240 kb
修改后栈空间:8192 kb
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !