时间:2021-05-19
几个重要的函数:
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutex_t *restrict attr); //初始化mutex
int pthread_mutex_destroy(pthread_mutex_t *mutex); //如果mutex是动态分配的,则释放内存前调用此函数。
int pthread_mutex_lock(pthread_mutex_t *mutex); //加锁
int pthread_mutex_trylock(pthread_mutex_t *mutex); //若已有其他线程占用锁,则返回EBUSY,否则返回0,不阻塞。
int pthread_mutex_unlock(pthread_mutex_t *mutex); //解锁
例程:
复制代码 代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
int a = 100;
int b = 200;
pthread_mutex_t lock;
void * threadA()
{
pthread_mutex_lock(&lock);
printf("thread A got lock!\n");
a -= 50;
sleep(3); //如果不加锁,threadB输出会是50和200
b += 50; //加锁后会sleep 3秒后,并为b加上50 threadB才能打印
pthread_mutex_unlock(&lock);
printf("thread A released the lock!\n");
a -= 50;
}
void * threadC()
{
sleep(1);
while(pthread_mutex_trylock(&lock) == EBUSY) //轮询直到获得锁
{
printf("thread C is trying to get lock!\n");
usleep(100000);
}
printf("thread C got the lock!\n");
a = 1000;
b = 2000;
pthread_mutex_unlock(&lock);
printf("thread C released the lock!\n");
}
void * threadB()
{
sleep(2); //让threadA能先执行
pthread_mutex_lock(&lock);
printf("thread B got the lock! a=%d b=%d\n", a, b);
pthread_mutex_unlock(&lock);
printf("thread B released the lock!\n", a, b);
}
int main()
{
pthread_t tida, tidb, tidc;
pthread_mutex_init(&lock, NULL);
pthread_create(&tida, NULL, threadA, NULL);
pthread_create(&tidb, NULL, threadB, NULL);
pthread_create(&tidc, NULL, threadC, NULL);
pthread_join(tida, NULL);
pthread_join(tidb, NULL);
pthread_join(tidc, NULL);
return 0;
}
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
monitor概念管程,监视器。在操作系统中,存在着semaphore和mutex,即信号量和互斥量,使用基本的mutex进行开发时,需要小心的使用mutex的
在《C++11并发指南三(std::mutex详解)》一文中我们主要介绍了C++11标准中的互斥量(Mutex),并简单介绍了一下两种锁类型。本节将详细介绍一下
前言实例代码讲解c#线程(上)使用Mutex类classProgram{staticvoidMain(string[]args){conststringMute
一、死锁会在什么情况发生1、假设有如下代码mutex;//代表一个全局互斥对象voidA(){mutex.lock();//这里操作共享数据B();//这里调用
go语言提供了一种开箱即用的共享资源的方式,互斥锁(sync.Mutex),sync.Mutex的零值表示一个没有被锁的,可以直接使用的,一个goroutine