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);
}


C++11多线程编程之互斥量

C++11多线程编程之互斥量
  • u012333003
  • u012333003
  • 2014年05月07日 15:55
  • 1144

多线程编程里如何运用CreateMutex,WaitForSingleObject,ReleaseMutex来实现线程同步

多线程编程里如何运用CreateMutex,WaitForSingleObject,ReleaseMutex来显现线程同步
  • tmshasha
  • tmshasha
  • 2015年03月28日 15:31
  • 617

多线程-互斥量

多线程线程同步机制是为是各线程能够协同工作而设计的。 Windows系统中有很多种机制可以用于线程同步,最常用的有下面几种: ◇互斥对象( Mutex); ◇ 事件对象(Event); ◇信号...
  • liuguangsh
  • liuguangsh
  • 2016年08月03日 14:59
  • 156

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

int sem_init(sem_t *sem, int pshared, unsigned int value); pshared:控制信号量的类型,0表示这个信号量是当前进程的局部信号量,否则,这...
  • a304672343
  • a304672343
  • 2013年12月03日 11:59
  • 527

Linux多线程编程入门-同步机制-条件变量

Linux平台上触发条件变量则自动复位。 条件变量的置位和复位有两种常用模型:第一种模型是当条件变量置位(signaled)以后,如果当前没有线程在等待,其状态会保持为置位(signaled),直到...
  • a304672343
  • a304672343
  • 2013年12月04日 14:56
  • 651

Linux线程同步机制的几种方法总结与对比

线程同步机制的几种方法总结与对比 需要线程同步的原因: 当有多个线程同时访问一个共享内存里面的变量时,有时会出现一个线程正在修改该变量的值,而其他的线程正在读取数据,可能就会导致错误。   实...
  • u010853261
  • u010853261
  • 2014年10月28日 14:46
  • 1443

Linux 同步机制:互斥量

互斥锁互斥锁也叫互斥量,也是Linux的一种同步机制。互斥锁相比信号量增加了所有权的概念,被锁的互斥量只能由给它上锁的线程解开,而信号量则无此限制。信号量侧重在资源的数量,可用来实现按一定逻辑调度线程...
  • thisinnocence
  • thisinnocence
  • 2016年12月26日 23:59
  • 350

【C/C++多线程编程之六】pthread互斥量

多线程编程之线程同步互斥量       Pthread是 POSIX threads 的简称,是POSIX的线程标准。           Pthread线程同步指多个线程协调地,有序地同步使...
  • Jiangweihll
  • Jiangweihll
  • 2014年05月02日 21:38
  • 6488

从零学习linux多线程编程--第一篇

线程(thread)技术早在60年代就被提出,但真正应用多线程到 ***作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中...
  • sunsnow2
  • sunsnow2
  • 2014年08月19日 20:59
  • 554

Linux多线程编程入门

线程基本知识\quad进程是资源管理的基本单元,而线程是系统调度的基本单元,线程是操作系统能够进行调度运算的最小单位,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制...
  • taoyanqi8932
  • taoyanqi8932
  • 2017年02月21日 17:43
  • 1224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux多线程编程入门-同步机制-互斥量
举报原因:
原因补充:

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