首页 > 技术知识 > 正文

Linux下线程编程(2)

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

 1.6 线程取消函数pthread_cancel

复制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

1.7 线程分离属性pthread_detach

创建一个线程默认的状态是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

1.8 设置线程栈空间

  查看线程堆栈空间:

复制[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)

 1.9 通过函数设置和查询线程栈空间

复制#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

审核编辑:汤梓红

猜你喜欢