C语言实现多线程的上锁及解锁过程
创作时间:
作者:
@小白创作中心
C语言实现多线程的上锁及解锁过程
引用
CSDN
1.
https://blog.csdn.net/m0_55334488/article/details/141714185
在多线程编程中,确保线程安全地访问共享变量是一个重要的问题。本文将通过一个具体的C语言示例,介绍如何使用POSIX线程库(pthreads)中的互斥锁(mutex)来实现线程间的同步。
在C语言中,多线程编程通常使用POSIX线程库(pthreads),它提供了创建和管理线程的功能。为了保证线程安全地访问共享变量,可以使用互斥锁(mutex)。下面是一个简单的示例,展示了如何使用pthread库中的互斥锁来保护共享变量的访问。
C语言示例代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// 共享变量
int shared_counter = 0;
// 创建一个互斥锁
pthread_mutex_t lock;
void* increment_counter(void *arg) {
int i;
for (i = 0; i < 100000; i++) {
// 获取锁
pthread_mutex_lock(&lock);
{
shared_counter++;
}
// 释放锁
pthread_mutex_unlock(&lock);
}
return NULL;
}
int main() {
// 初始化互斥锁
pthread_mutex_init(&lock, NULL);
// 创建线程
pthread_t thread1, thread2;
if (pthread_create(&thread1, NULL, increment_counter, NULL) != 0) {
perror("Failed to create thread1");
exit(EXIT_FAILURE);
}
if (pthread_create(&thread2, NULL, increment_counter, NULL) != 0) {
perror("Failed to create thread2");
exit(EXIT_FAILURE);
}
// 等待线程结束
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
// 输出结果
printf("Final value of shared_counter: %d\n", shared_counter);
// 销毁互斥锁
pthread_mutex_destroy(&lock);
return 0;
}
以上代码可以直接使用。下面是代码的详细说明:
- 定义共享变量:
shared_counter
是一个全局变量,它将在两个线程之间共享。 - 初始化互斥锁:使用
pthread_mutex_init
函数初始化互斥锁lock
。 - 定义工作函数:
increment_counter
函数用来增加shared_counter
的值。 - 获取和释放锁:在修改
shared_counter
之前先使用pthread_mutex_lock
获取锁,并在完成后使用pthread_mutex_unlock
释放锁。这样可以保证每次只有一个线程能够修改shared_counter
。 - 创建和启动线程:使用
pthread_create
创建两个线程并启动它们。 - 等待线程结束:使用
pthread_join
等待所有线程完成。 - 输出结果:打印出最终的
shared_counter
值。 - 销毁互斥锁:使用
pthread_mutex_destroy
销毁互斥锁。
通过这个示例,我们可以看到互斥锁在多线程编程中的重要作用,它能够有效地避免多个线程同时访问共享资源时可能出现的竞态条件(race condition)问题。
热门推荐
为什么要提倡睡子午觉?怎样睡觉才是最好的?
散曲的体制有哪些?风格是什么样的?
散曲包括(散曲)
亚历山大东征遇秦国:秦军装备考古揭秘东西方军事对决
NBA今日里程碑:森林狼45分血洗掘金创多项历史纪录
达人热衷短剧创作,AIGC、非遗、情感题材受捧
一战华工纪念考古展 首次展示华工考古发掘工作
如何正确有效拨打120?干货在这里!
SMS Verification
杭宁高速公路拟扩容至双向十、十二车道,项目可行性研究报告编制
患哪些病不能开车?驾车时突发疾病,该怎么办?
中科院微电子所存算一体芯片论文入选ISSCC 2025大会
你以为它是“胎记”?不!它是神经纤维瘤病
神经纤维瘤病治疗方法
15万元家用车选购指南:从预算到试驾全方位解析
2025年中国细胞医疗健康行业规模现状及未来展望
关于尼姑的特殊问题,你知道吗?
广州什么时候入冬?广东为什么不下雪?
劳动仲裁管辖地选择的重要性及操作方法
汽车客运站级别划分和建设要求
大便为什么会不成形?原因竟然不在肠道,而在大脑
葛兆光丨“同中求异”:寻找中日传统政治文化的差异及其影响
光伏合同正规化:如何确保合同的合法性和有效性?
先进PID控制算法在永磁同步电机发电控制中的仿真研究
如何分析涨停后股票的换手率变化
公司会不会破产?从这4个指标看偿债能力
对联知识之诗钟
宝可梦朱紫晶光花配招攻略 晶光花怎么配招
古代律制律学的发展:从古至今的演变与影响
癌症患者要禁「發物」嗎?營養師曝蛋白質攝取不足恐增死亡率