linux多线程编程入门-同步机制-互斥量

原创 2013年12月03日 10:40:25

所谓同步,并不是日常用语中的同时进行的意思。这里的同步是指如何阻止同步进行的意思。

互斥量,又称互斥锁,它允许程序员锁住某个对象,使得每次只能有一个线程访问它。为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后解锁。


  加锁解锁成对出现。如果一个线程已加锁,而另一个线程试图加锁,则会阻塞在那里,直到第一个线程解锁,才继续往下执行。如果同一个线程连着两次加锁,则死锁,因为没有解锁。而解锁多加没有关系。

1 int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr); mutex:互斥量对象。mutexattr:互斥量对象属性,默认NULL即可。
2 int pthread_mutex_lock(pthread_mutex *mutex);
3 int pthread_mutex_destroy(pthread_mutex *mutex);
4 int pthread_mutex_unlock(pthread_mutex *

一个非常简单的应用互斥锁的很直观的例子,如果去掉锁,则结果不同。这仅是一个简单的范例,在实际应用中,多线程对同一个元素的操作都需要加锁,否则总有概率会出现类似这个例子中 出现的问题,即使可以通过sleep手段撇脚的暂时避开。

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
void * thread_fun1(void * arg);
void * thread_fun2(void * arg);
int a = 200;
int b = 400;
pthread_mutex_t work_mutex;

int main()
{
	pthread_t thread1, thread2;
	int res;
	res = pthread_mutex_init(&work_mutex, NULL);
	pthread_create(&thread1, NULL, thread_fun1, NULL);
	pthread_create(&thread2, NULL, thread_fun2, NULL);
	pthread_join(thread1, NULL);
	pthread_join(thread2, NULL);
	pthread_mutex_destroy(&work_mutex);
	exit(EXIT_SUCCESS);
}
void * thread_fun1(void * arg)
{
	pthread_mutex_lock(&work_mutex);
	a += 50;
	sleep(5);
	b -= 50;
	pthread_mutex_unlock(&work_mutex);
}
void * thread_fun2(void * arg)
{
	pthread_mutex_lock(&work_mutex);
	sleep(1);
	printf("a+b is %d\n", a+b);
	pthread_mutex_unlock(&work_mutex);
}


Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资...

Linux多线程编程入门-同步机制-信号量

int sem_init(sem_t *sem, int pshared, unsigned int value); pshared:控制信号量的类型,0表示这个信号量是当前进程的局部信号量,否则,这...

linux下多线程同步机制之信号量、互斥量、读写锁、条件变量

之前有写过类似的博客,这东西不用老忘,现在又有更清晰的理解了。 一、信号量 信号量最基本的两个操作就是PV操作:P()操作实现信号量减少,V()操作实现信号量的增加 信号量的值取决于信号量的类型,信号...
  • ylf13
  • ylf13
  • 2013年10月29日 16:39
  • 6058

linux多线程-----同步机制(互斥量、读写锁、条件变量)

linux多线程-----同步机制(互斥量、读写锁、条件变量)

Linux多线程编程(三)线程同步之互斥量

线程之间对资源的竞争:互斥量Mutex 信号灯Semaphore 条件变量Conditions 1. 互斥量Mutex 线程在取出头节点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量...

windows多线程同步机制---互斥量

1 互斥量     多个线程同时只能有一个执行.等候到互斥量的线程就拥有了互斥量,在线程释放该互斥量之前,别的等候该互斥量的线程都不会等候到        2 互斥量使用     2.1 创建互斥  ...
  • rankun1
  • rankun1
  • 2016年02月17日 20:39
  • 390

【原创】《Linux高级程序设计》杨宗德著 - Linux多线程编程 - 线程同步机制

【原创】《Linux高级程序设计》杨宗德著 - Linux多线程编程 - 线程同步机制

C++多线程编程同步技术剖析:临界区,时间,信号量,互斥量

摘要: 多线程同步技术是计算机软件开发的重要技术,本文对多线程的各种同步技术的原理和实现进行了初步探讨。关键词: VC++6.0; 线程同步;临界区;事件;互斥;信号量; 正文 使线程同步   在程序...

Linux多线程同步机制 .linux多线程编程机制

一、互斥锁 尽管在Posix Thread中同样可以使用IPC的信号量机制来实现互斥锁mutex功能,但显然semphore的功能过于强大了,在Posix Thread中定义了另外一套专门用于线程同...
  • scdxmoe
  • scdxmoe
  • 2013年11月13日 20:54
  • 755

对多线程编程和线程同步机制的小理解

多线程技术被设计出来是为了充分利用多核cpu的优势,让cpu
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux多线程编程入门-同步机制-互斥量
举报原因:
原因补充:

(最多只允许输入30个字)