linux c pthread_mutex_t 效率,linuxc_螺纹锁紧pthread_mutex_t

在实际执行过程中的线程,我们经常需要同步多线程。

然后你可以使用互斥锁来完成任务;在使用过程中互斥锁,有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函数以完毕锁的初始化,锁的销毁。上锁和释放锁操作。

一。锁的创建

锁能够被动态或静态创建,能够用宏PTHREAD_MUTEX_INITIALIZER来静态的初始化锁,採用这样的方式比較easy理解,相互排斥锁是pthread_mutex_t的结构体,而这个宏是一个结构常量。例如以下能够完毕静态的初始化锁:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

另外锁能够用pthread_mutex_init函数动态的创建。函数原型例如以下:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)

二,锁的属性

相互排斥锁属性能够由pthread_mutexattr_init(pthread_mutexattr_t *mattr);来初始化。然后能够调用其它的属性设置方法来设置其属性。

相互排斥锁的范围:能够指定是该进程与其它进程的同步还是同一进程内不同的线程之间的同步。能够设置为PTHREAD_PROCESS_SHARE和PTHREAD_PROCESS_PRIVATE。默认是后者。表示进程内使用锁。

能够使用int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)

pthread_mutexattr_getshared(pthread_mutexattr_t *mattr,int *pshared)

用来设置与获取锁的范围;

相互排斥锁的类型:有下面几个取值空间:

PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这样的锁策略保证了资源分配的公平性。

PTHREAD_MUTEX_RECURSIVE_NP。嵌套锁。同意同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。假设是不同线程请求。则在加锁线程解锁时又一次竞争。

PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,假设同一个线程请求同一个锁。则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作同样。

这样就保证当不同意多次加锁时不会出现最简单情况下的死锁。

PTHREAD_MUTEX_ADAPTIVE_NP。适应锁。动作最简单的锁类型。仅等待解锁后又一次竞争。

能够用

pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)

pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)

获取或设置锁的类型。

三,锁的释放

调用pthread_mutex_destory之后。能够释放锁占用的资源,但这有一个前提上锁当前是没有被锁的状态。

四,锁操作

对锁的操作主要包含加锁 pthread_mutex_lock()、解锁pthread_mutex_unlock()和測试加锁 pthread_mutex_trylock()三个。

int pthread_mutex_lock(pthread_mutex_t *mutex)

int pthread_mutex_unlock(pthread_mutex_t *mutex)

int pthread_mutex_trylock(pthread_mutex_t *mutex)

pthread_mutex_trylock()语义与pthread_mutex_lock()类似。不同的是在锁已经被占领时返回EBUSY而不是挂起等待

五。锁的使用

#include 

#include 

pthread_mutex_t mutex ;

void*print_msg(void*arg){

inti=0;

pthread_mutex_lock(&mutex);

for(i=0;i<15;i++){

printf("output : %d

",i);

usleep(100);

}

pthread_mutex_unlock(&mutex);

}

intmain(intargc,char** argv){

pthread_t id1;

pthread_t id2;

pthread_mutex_init(&mutex,NULL);

pthread_create(&id1,NULL,print_msg,NULL);

pthread_create(&id2,NULL,print_msg,NULL);

pthread_join(id1,NULL);

pthread_join(id2,NULL);

pthread_mutex_destroy(&mutex);

return1;

}

#include

#include

pthread_mutex_t mutex ;

void *print_msg(void *arg){

int i=0;

pthread_mutex_lock(&mutex);

for(i=0;i<15;i++){

printf("output : %d

",i);

usleep(100);

}

pthread_mutex_unlock(&mutex);

}

int main(int argc,char** argv){

pthread_t id1;

pthread_t id2;

pthread_mutex_init(&mutex,NULL);

pthread_create(&id1,NULL,print_msg,NULL);

pthread_create(&id2,NULL,print_msg,NULL);

pthread_join(id1,NULL);

pthread_join(id2,NULL);

pthread_mutex_destroy(&mutex);

return 1;

}将运行一个螺纹螺纹。

版权声明:本文博主原创文章。博客,未经同意不得转载。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值