多线程篇——初始Linux线程

线程模型
线程是程序完成一个独立任务的完整执行序列,即一个可调度的实体。根据运行环境和调度者的身份,线程可分为内核线程和用户线程。内核线程运行在内核空间上由内核调度,用户线程运行在用户空间上由线程库来调度。一个进程可以有M个内核线程、N个用户线程(M<=N)。并且在一个系统中所有进程M:N一定,按这个比值线程实现方式可分为三种模式:完全在用户空间实现、完全由内核调度和双层调度。相对于前两种双层调度模型结合了前两种的优点:不但不消耗内存并且切换速度快、CPU利用率高。
线程相关函数和数据结构
typedef unsigned long int pthread_t;//线程的标识符
1.pthread_create:线程创建函数
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
			       void *(*start_routine) (void *),void *arg);
	thread: 线程标识符
	attr:线程属性设置,NULL表示缺省属性
	start_routine:线程执行函数参数和返回值都为空
	arg:传递给执行函数的参数
	返回值:成功0,失败返回错误编号

2.pthread_exit:线程一旦创建好,就由内核调度执行函数。线程在结束时最好调用线程退出函数,以确保安全稳定的退出。

#include <pthread.h>
void pthread_exit(void *retval);
	retval:退出所传入得参数
pthread_exit:retval向线程调度者传输退出信息。
3.pthread_join:等待回收线程
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
	thread:线程标识符
	retval:线程退出传递的参数
	返回值:成功返回0,错误返回错误代码
			EDEADLK:可能引起死锁,两个线程相互调用pthread_join或者自身调用pthread_join
			EINVAL:目标线程是不可回收的或者已经被其他线程/进程回收了
			ESRCH:没有该线程
pthread_cancel:异常关闭一个线程即取消一个线程
#include <pthread.h>
int pthread_cancel(pthread_t thread);
thread:线程标识符
不过接受到取消请求的目标线程可以决定是否取消以及如何取消,这分别由这两个函数完成。
#include <pthread.h>
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
这两个函数的第一个参数分别用于设置线程的取消状态(是否取消)和取消类型(如何取消),
第二个参数分别记录线程原来的状态和取消类型。
state可以有两个选值:
	PTHREAD_CANCEL_ENABLE:允许线程被创建时的默认取消状态。
	PTHREAD_CANCEL_DISABLE:禁止线程被取消。这种情况下
			如果一个线程收到取消请求则他会被挂起知道线程允许取消。
type可选值:
	PTHREAD_CANCEL_ASYNCHRONOUS:线程随时都可以被取消。
	PTHREAD_CANCEL_DEFERRED:允许目标线程推迟行动,
		直到调用下面个所谓的取消函数中的一个
		pthread_join,pthread_testcancel,pthread_cond_wait,pthread_cond_timedwait,
		sem_wait和sigwait。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值