线程

线程:是cpu调度和分派的基本单位,线程一般不拥有资源,但是可以调用所属进程的资源。
在编译时,需要包含一个库,-lpthread。
1、pthread_create(pthread_t *pthread,NULL,fuc,NULL)
这个是一般用法,第二个和第四个参数全是NULL,
第一个参数是线程号,第三个参数是要调用的线程函数。
2、pthread_join(thread,NULL)
这个也是一般用法,等待thread进程结束。会阻塞。并回收子进程的资源。
3、pthread_detach(thread)
分离函数,使thread和当前进程分离,成为一个独立的线程。
4、进程的结束方法:
从执行函数中返回;线程调用pthread_exit()退出线程;被同一进程中的其他线程取消。
pthread_exit(void *value_ptr)使该线程结束,但其占用资源不会被回收。因为其他进程可能还在用。
5、pthread_cancel(thread)
取消thread线程。该函数实质是伐信号给目标线程,不阻塞。
并不是所有进程都可以被取消,可以设置为取消状态和取消点,
6、pthread_setcancelstate(stat,int *old_set)
设置线程的取消状态。
stat:取值:PTHREAD_SETCANCEL_DISABLE:可以被取消;
PTHREAD_SETCANCEL_ENABLE:不能被取消。
old_set:一般取值为NULL;
7、pthread_setcanceltype()
设置进程是否立即取消。
pthread_setcanceltype(int type,int *type)
type:取值:PTHREAD_CANCEL_ASYNCHRONOUS:立即取消;
PTHREAD_CANCEL_DEFERRED:不立即取消;
8、pthread_cleanup_push(fuc,void *arg)
fuc:清理函数名;
arg:是传给清理函数的参数;
这个是压栈过程。在弹栈的时候是先进后出。
9、pthread_cleanup_pop(int execute)
弹栈函数。
execute:非0:弹出清理函数,并执行清理函数,
为0:弹出,但是不执行清理函数。
只有在进程要结束的时候或者execute为0时才能调用这个函数。这是自发的调用。但是无论哪种都会删除清理函数。
压栈函数(注册函数)和弹栈函数都要成对使用。


同步和互斥
1、互斥锁:先建锁(即初始化一次,就可以声明了一个互斥锁)、然后上锁(上锁后,只能该线程或者函数使用)、最后解锁(当上锁的程序执行完毕后,把锁打开,其他的线程就能够来抢占该锁)。
2、初始化互斥锁有两种方法:
(1):pthread_mutex_init(mutex,NULL)这就建立一个互斥锁;
(2):mutex=PTHREAD_MUTEX_INITIALIZER这直接给一个pthread_mutex_t 类型的变量附一个初值,就相当于声明了这个互斥锁。
3、pthread_mutex_lock(pthread_mutex_t *mutex);上锁函数
4、pthread_mutex_trylock(&mutex);试上锁;
5、pthread_mutex_unlock(&mutex);解锁;
6、pthread_mutex_destroy(&mutex);摧毁这个锁。


信号量:
1、PV原语:一次P操作使信号量减1,一次V操作使信号量加1;PV原语主要用于进程或线程的同步和互斥的典型情况。因为PV原语就是使在执行一次P后,保证该进程结束,结束时进行一次V操作,才能把执行权交给出去。
典型的互斥原理图:
 
典型的同步原理图:

 
下边是怎样创建信号量,初始化,操作:

1、sem_init(&sem,0,val)
第一个参数是该信号量的地址,第三个参数是初始值。这样能创建一个标识符为sem,初始值为val的信号量。
2、sem_wait(&sem)
该信号量减1;如果减1后小于0,就阻塞在这个函数这里,不继续运行。
3、sem_post(&sem)
信号量加1;
4、sem_getvalue(&sem,&val)
获取sem标识的信号量的值,存在val中。
5、sem_destroy(&sem)
删除sem标识的信号量。

 

 

 

 

 

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值