线程最大的特点就是资源的共享性,然而资源共享中的同步问题是多线程编程的难点。互斥锁通过锁机制来实现线程间的同步。使用互斥锁前必须进行初始化操作。初始化有两种方式:一种是静态赋值法,将将宏结构常量PTHREAD_MUTEX_INITIALIZER赋给互斥锁,操作语句如下:
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
另一种方式是通过pthread_mutex_init函数初始化互斥锁,该函数的原型如下:
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t * mutexattr);
函数中的参数mutexattr表示互斥锁的属性,如果为NULL则使用默认属性。
初始化以后,就可以给互斥锁加锁了,加锁有两个函数:pthread_mutex_lock()和pthread_mutex_trylock();
用pthread_mutex_lock()加锁时,如果mutex已经被锁住,当前尝试加锁的线程就会阻塞,直到互斥锁被释放。当
pthread_mutex_lock函数返回时,说明互斥锁已经被当前线程成功加锁。pthread_mutex_trylock函数则不同,如果mutex已经加锁,它将立即返回,返回的错误码为EBUSY,而不是阻塞等待。
注:加锁时,不论哪种类型的锁,都不可能被两个不同的线程同时得到,其中一个必须等待解锁。在同一进程中的线程,如果加锁后没有解锁,则其他线程将无法再获得该锁。
函数pthread_mutex_unlock(pthread_mutex_t *mutex);
用pthread_mutex_unlock函数解锁时,要满足两个条件:一个是互斥锁处于加锁状态,二是调用本函数的线程必须是给互斥锁加锁的线程。解锁后如果有其他线程在等待互斥锁,等待队列中的第一个线程将获得互斥锁。
当一个互斥锁使用完毕后,必须进行清除。清除互斥锁使用函数pthread_mutex_destory,该函数原型如下:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
清除一个互斥锁意味着释放它所占用的资源,清除锁是要求当前处于开放状态,若锁处于锁定状态,函数返回EBUSY,该函数成功时返回哦0。由于在Linux中,互斥锁并不占用内存,因此pthread_mutex_destory()除了解除互斥锁的状态以外没有其他操作。
下面是我写的一个小例子。
#include<stdio.h>
#include<pthread.h> //引入线程头文件
int wu=0; //全局变量
pthread_mutex_t mut; //定义互斥锁变量
void thread(void) //线程1对全局变量做3333次自增操作
{
int i;
for(i=0;i<3333;i++)
{
pthread_mutex_lock(&mut); //加锁
wu++;
pthread_mutex_unlock(&mut); //解锁
printf("This is a pthread\n");
}
}
void thread2(void) //
{
int i;
for(i=0;i<2222;i++)//线程2对全局变量做2222次自增操作
{
pthread_mutex_lock(&mut); //加锁
wu++;
pthread_mutex_unlock(&mut); //解锁
printf("This is a pthread2\n");
}
}
int main()
{
pthread_t id=0,id2=0;
int i,ret,ret2;
pthread_mutex_init(&mut,NULL); //互斥锁的初始化
ret=pthread_create(&id,NULL,(void * )thread,NULL); //创建线程1
ret2=pthread_create(&id2,NULL,(void * )thread2,NULL); //创建线程2
if(ret!=0)
{
printf("Create pthread error!\n");
exit(1);
}
if(ret2!=0)
{
printf("Create pthread2 error!\n");
exit(1);
}
for(i=0;i<3;i++)
{
printf("This is the main process\n");
}
pthread_join(id,NULL); //等待线程1结束
pthread_join(id2,NULL); //等待线程2结束
printf("wu=%d\n",wu);
return (0);
}
[root@wuzhq thread]# ls
simple1.c th_ex th_pool thread_example.c thread_pool.c
[root@wuzhq thread]# gcc -o simple1 simple1.c -lpthread(这块的-lpthread不能缺少)
运行,得出wu=5555,始终为5555。试着把互斥锁去掉,会发现,结果每次都不一样,多数情况下都小于5555,这就是线程间抢占资源造成的结果。下次再聊
分享到:
相关推荐
互斥锁是一种同步原语,它的核心思想是:当一个线程获取到锁后,其他试图获取该锁的线程将被阻塞,直到持有锁的线程释放锁。这样,就确保了在同一时刻,只有一个线程能够执行临界区的代码,从而避免了数据竞争和不...
在多线程编程中,互斥锁(Mutex)和事件锁(Event)是两种常见的同步机制,用于确保多个线程安全地访问共享资源。本文将深入探讨这两种锁的工作原理、使用场景及其优缺点。 首先,互斥锁是线程同步的基础工具之一。...
在多线程编程中,确保线程安全是至关重要的,特别是在Linux系统中,为了管理共享资源,Linux提供了互斥锁、条件变量和信号量这三种同步机制。它们都是用于协调多个线程对共享数据的访问,防止数据不一致性和竞态条件...
ConsoleApp_Mutex,C++互斥锁源码cpp,可在VC++6.0或VS下直接编译运行,演示结果,控制台程序,ConsoleApp_Mutex,C++互斥锁源码cpp,可在VC++6.0或VS下直接编译运行,演示结果,控制台程序,
讲述了vxworks 互斥锁的应用,由于资料较少,这还是比较难得的
当一个线程获取了互斥锁后,其他试图获取该锁的线程将会被阻塞,直到持有锁的线程释放锁。 - **工作原理**:获取锁的线程会在操作共享资源前先尝试锁定,如果成功则进行操作;完成后解锁,允许其他等待的线程获取。...
本主题将深入探讨如何使用互斥锁、条件变量以及共享内存这三种机制来实现无亲缘关系间进程的同步通信。 1. **互斥锁(Mutex)**: 互斥锁是一种基本的同步原语,用于保护共享资源。当一个进程获取了互斥锁后,其他...
在本教程中,我们将探讨“互斥锁”这一机制,它是实现线程同步的一种常见方法。互斥锁在STM32微控制器上使用RT-thread实时操作系统时尤为重要。 首先,我们要理解什么是互斥锁。互斥锁,英文名为Mutex,是一种同步...
在IT行业中,线程是操作系统资源分配的基本单位,而互斥锁则是多线程编程中用于同步和保护共享资源的重要工具。在这个“线程与互斥锁的应用”场景中,我们有两个线程,一个名为echo,另一个名为cat,它们都涉及到...
在多线程编程中,互斥锁(Mutex)是一种重要的同步机制,用于保证共享资源在同一时刻只能被一个线程访问。本项目提供了在Linux和Windows系统下通用的互斥锁Mutex封装,实现了跨平台的兼容性,使得开发者无需关心底层...
计算机操作系统:互斥锁实验 本实验报告的主要目的是通过编写 VC++ 程序来应用和管理互斥锁,了解操作系统同步与互斥的原理。本实验使用 Windows 7 或以上版本和 VS2010 或以上版本作为实验环境,设计一个主函数与...
在Windows操作系统中,互斥锁(Mutex)是一种用于线程同步的重要工具,它确保同一时间只有一个线程可以访问特定的资源或代码段。基于这个概念,我们有一个已经封装好的互斥锁类,使得在实际编程中使用起来更加简便。...
Linux下互斥锁的应用,用作互斥锁入门
信号量和互斥锁是操作系统中用于进程同步和资源管理的重要机制,它们在多线程编程和并发控制中发挥着至关重要的作用。本示例代码来源于《深入理解计算机系统》这本书,通过具体代码来帮助读者深入理解这两种机制的...
在做多线程开发时,互斥锁是必不可少的。但c语言不像c++11有标准的线程库,在各种编译器支持的平台都可以使用。而且跨平台开发中,在业务逻辑里写不同平台的兼容代码,容易造成过多的冗余,以及代码结构过于复杂的...
本示例中提到的“linux无亲缘关系进程间通信”着重讲解了如何利用互斥锁(Mutex)、条件变量(Condition Variable)以及共享内存(Shared Memory)这三种机制来实现非父子进程间的同步通信。 1. **互斥锁**:互斥锁...
互斥锁与条件变量详解 互斥锁(Mutex)是多线程编程中最基本的同步机制之一,它用于保护共享资源免受多个线程同时访问的干扰。条件变量(Condition Variable)则是另一个重要的同步机制,它允许线程在满足特定条件...
### 信号量与互斥锁:深度解析及应用 #### 引言 在现代操作系统与多线程编程中,信号量(Semaphore)与互斥锁(Mutex)是两种广泛使用的关键同步机制,它们的设计旨在解决多线程环境下的资源竞争问题,确保数据的...
而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起配合使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。...