提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
linux 互斥锁mutex锁使用示例,两个线程操作一个全局变量。
提示:以下是本篇文章正文内容,下面案例可供参考
一、互斥锁mutex是什么?
互斥锁(Mutex,Mutual Exclusion Object的简称)是一种常用的同步机制,用于控制多个线程或进程对共享资源的独占访问。在多线程或多进程编程中,当多个执行单位(如线程)需要访问同一份共享数据时,如果没有适当的同步措施,可能会导致竞态条件(race condition),从而引起程序行为的不确定性。
- 互斥锁(Mutex)
- 适用场景:当需要保护一个共享资源,确保同一时刻只有一个线程可以访问时,互斥锁是首选。
- 优点:简单易用,支持递归锁,即允许一个线程多次锁定同一个锁而不死锁。
- 缺点:如果线程被调度器挂起或阻塞,持有锁的线程可能无法及时释放锁,导致其他线程等待。
当一个线程对互斥锁(mutex)加锁后,任何其他试图对该锁加锁的线程都将被阻塞,直到原始持有锁的线程释放锁。
互斥锁用在 同一个进程的线程间 使用
pthread_mutex_init
pthread_mutex_destroy
pthread_mutex_lock
pthread_mutex_trylock
pthread_mutex_unlock
二、代码示例
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
// 定义一个全局变量
int global_counter = 0;
// 创建一个互斥锁
pthread_mutex_t counter_lock;
// 函数用于修改全局变量
void increment_counter() {
//pthread_mutex_lock(&counter_lock); // 加锁
int ret = -1;
while(ret != 0)
{
ret = pthread_mutex_trylock(&counter_lock);
if(0 == ret)
{
global_counter++; // 修改全局变量
pthread_mutex_unlock(&counter_lock); // 解锁
}else if(ret == EBUSY)
{
printf("EBUSY\n");
}else
{
printf("pthread_mutex_trylock error ret = %d\n", ret);
}
}
}
// 线程函数
void* thread_function(void* arg) {
int i;
for (i = 0; i < 10; i++) {
printf("thread_function enter id = %d, i = %d, global_counter = %d\n", *((int *)arg),i, global_counter);
increment_counter();
usleep(1); // 防止第一个线程执行完,第二个线程才执行
}
return NULL;
}
int main() {
pthread_t thread1, thread2;
int i = 1;
int j = 2;
// 初始化互斥锁
pthread_mutex_init(&counter_lock, NULL);
// 创建两个线程
pthread_create(&thread1, NULL, thread_function, &i);
pthread_create(&thread2, NULL, thread_function, &j);
// 等待两个线程结束
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
// 销毁互斥锁
pthread_mutex_destroy(&counter_lock);
// 输出最终的全局变量值
printf("Final value of the counter is %d\n", global_counter);
return 0;
}
总结
应用层c,互斥锁的基本使用,代码可以运行。
标签:示例,lock,counter,互斥,线程,pthread,mutex From: https://blog.csdn.net/qq_37077309/article/details/140497537