【Linux开发】linux线程同步方式互斥锁介绍及实例
来源:互联网 发布:淘宝标题如何自动生成 编辑:程序博客网 时间:2024/05/21 17:55
1、互斥锁(mutex)
通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex *mutex);
int pthread_mutex_destroy(pthread_mutex *mutex);
int pthread_mutex_unlock(pthread_mutex *
(1)先初始化锁init()或静态赋值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER
attr_t有:
PTHREAD_MUTEX_TIMED_NP:其余线程等待队列
PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁,允许线程多次加锁,不同线程,解锁后重新竞争
PTHREAD_MUTEX_ERRORCHECK_NP:检错,与一同,线程请求已用锁,返回EDEADLK;
PTHREAD_MUTEX_ADAPTIVE_NP:适应锁,解锁后重新竞争
(2)加锁,lock,trylock,lock阻塞等待锁,trylock立即返回EBUSY
(3)解锁,unlock需满足是加锁状态,且由加锁线程解锁
(4)清除锁,destroy(此时锁必需unlock,否则返回EBUSY,//Linux下互斥锁不占用内存资源
2、实例及运行结果
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int tmp;
void* thread1(void *arg)
{
printf("thread id is %d\n",pthread_self());
pthread_mutex_lock(&mutex);
tmp = 1;
printf("Now a is %d\n",tmp);
pthread_mutex_unlock(&mutex);
return NULL;
}
void* thread2(void *arg)
{
printf("thread id is %d\n",pthread_self());
pthread_mutex_lock(&mutex);
tmp = 2;
printf("Now a is %d\n",tmp);
pthread_mutex_unlock(&mutex);
return NULL;
}
int main()
{
pthread_t id1;
pthread_t id2;
printf("main thread id is %d\n", pthread_self() );
tmp = 3;
printf("In main func tmp = %d\n", tmp);;
if (!pthread_create(&id1, NULL, thread1, NULL))
{
printf( "Create thread success!\n");
}
if (!pthread_create(&id2, NULL, thread2, NULL))
{
printf( "Create thread success!\n");
}
sleep(1);
pthread_join(id1, NULL);
pthread_join(id2, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
gcc -o mutex mutex.c -lpthread;./mutex
执行结果如下:
main thread id is -1568364736
In main func tmp = 3
Create thread success!
thread id is -1568368896
Now a is 1
Create thread success!
thread id is -1576761600
Now a is 2
- 【Linux开发】linux线程同步方式互斥锁介绍及实例
- 【Linux开发】linux线程同步方式信号量介绍及实例
- 【Linux开发】linux线程同步方式条件变量介绍及实例
- linux线程同步方式
- Linux线程及同步
- 线程及同步(linux)
- Linux C 线程同步实例
- linux线程同步:互斥锁
- linux Posix线程同步(条件变量) 实例
- Linux C编程(5) 线程同步实例
- linux Posix线程同步(条件变量) 实例
- UNIX/Linux-线程同步(实例入门篇)
- linux Posix线程同步(条件变量) 实例
- linux内核驱动模块开发步骤及实例入门介绍
- Linux C 多线程互斥锁及线程同步问题
- Linux C 多线程互斥锁及线程同步问题 (二)
- Linux下线程间通信及同步
- Linux多线程及线程间同步
- 835全讯网为你解常见的操盘手法
- ArrayList和LinkedList区别
- 每天一个(设计模式)-- Bridge模式(桥接模式)
- 【freemarker详解】—— Freemarker常用技巧
- 数字水印初谈
- 【Linux开发】linux线程同步方式互斥锁介绍及实例
- 请!继续!
- Linux性能测试 pmap命令
- 求一组数中前k个最大的数
- OpenGL API(转)
- 二叉树的遍历java实现
- N阶楼梯上楼问题_1205
- hdu 2993 斜率优化+二分查找
- Android中的底部菜单框架(Fragment)