【Linux】线程属性控制

来源:互联网 发布:怎么网络推广 编辑:程序博客网 时间:2024/04/30 11:04

1.概念

多线程的控制流程可以长期并存,操作系统会在各线程之间调度和切换,就像在多个进程之间调度和切换一样。由于同一进程的多个线程共享同一地址空间,因此 Text Segment、Data Segment 都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一 个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:

(1)文件描述符表

(2)每种信号的处理方式( SIG_IGN、SIG_DFL 或者自定义的信号处理函数)

(3)当前工作目录

(4)用户 id 和组 id

但有些资源是每个线程各有一份的:

(1)线程 id

(2)上下文,包括各种寄存器的值、程序计数器和栈指针

(3)栈空间

(4)errno 变量

(5)信号屏蔽字

(6)调度优先级

我们将要学习的线程库函数是由 POSIX 标准定义的,称为 POSIX thread 或者 pthread。在 Linux 上线程函数位于 libpthread 共享库中,因此在编译时要加上

 -lpthread 选项。


2. 函数

(1)创建

函数:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

返回值:成功返回0,失败返回错误号。

(2)等待

函数:int pthread_join(pthread_t thread, void **retval);

返回值:成功返回0,失败返回错误号。

(3)终止

如果需要只终止某个线程而不终止整个进程,可以有三种方法:

a. 从线程函数 return。这种方法对主线程不适用,从 main  函数 return 相当于调用 exit。

b. 线程可以调用 pthread_exit  终止自己。

函数:void pthread_exit(void *retval);

c. 一个线程可以调用 pthread_cancel 终止同一进程中的另一个线程。

取消函数:int pthread_cancel(pthread_t thread);

(4)分离

函数:int pthread_detach(pthread_t thread);

返回值:成功返回0,失败返回错误号。

线程可以自己分离自己,函数:pthread_detach(pthread_self());

线程也可以被别人分离,函数:pthread_detach(thread_id);


3. 举例



子线程调用 pthread_exit,主线程调用 pthread_cancel 终止线程的代码:

mypthread.c  的代码:




Makefile  的代码.:



运行结果如下:



分离线程,子线程调用 pthread_exit,主线程调用 return  终止线程的代码:

mypthread.c  的代码:




运行结果如下:






原创粉丝点击