iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中如何利用软件代替Mutex互斥锁
  • 742
分享到

C语言中如何利用软件代替Mutex互斥锁

2023-06-17 04:06:41 742人浏览 安东尼
摘要

今天小编给大家分享一下C语言中如何利用软件代替Mutex互斥锁的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前言在 li

今天小编给大家分享一下C语言中如何利用软件代替Mutex互斥的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、前言

linux  系统中,当多个线程并行执行时,如果需要访问同一个资源,那么在访问资源的地方,需要使用操作系统为我们提供的同步原语来进行保护。同步原语包括:互斥锁、条件变量、信号量等,被保护的代码称作“临界区”。

这是非常正规的流程,我们基本上也都是这么做的。

那有没有想过,这些同步原语对代码的执行效率会产生多大的影响?是否可以不使用操作系统提供的这些机制,而是用其它纯软件的方法也能达到保护临界区的目的呢?

二、Peterson 算法简介

这个算法主要用来解决临界区的保护问题。我们知道,一个临界区必须保证 3 个条件:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 互斥访问: 在任意一个时刻,最多只能有一个线程可以进入临界区;

  3. 空闲让进:当没有线程正在执行临界区的代码时,必须在所有申请进入临界区的线程中,选择其中的一个,让它进入临界区;

  4. 有限等待:当一个线程申请进去临界区时,不能无限的等待,必须在有限的时间内获得许可进入临界区。也就是说,不论其优先级多低,不应该饿死在该临界区入口处。

Peterson算法是一个实现互斥锁的并发程序设计算法,可以控制两个线程访问一个共享的用户资源而不发生访问冲突。

Peterson 算法是基于双线程互斥访问的 LockOne 与 LockTwo 算法而来。

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. LockOne 算法使用一个 flag 布尔数组来实现互斥;

  3. LockTwo 使用一个 turn 的整型量来实现互斥;

这 2 个算法都实现了互斥,但是都存在死锁的可能。Peterson 算法把这两种算法结合起来,完美地用软件实现了双线程互斥问题。

算法说明如下

C语言中如何利用软件代替Mutex互斥锁

两个重要的全局变量:

1. flag 数组:有 2 个布尔元素,分别代表一个线程是否申请进入临界区;

2. turn:如果 2 个线程都申请进入临界区,这个变量将会决定让哪一个线程进入临界区;

三、测试代码

// 被 2 个线程同时访问的全局资源 static int num = 0;   BOOL flag[2] = { 0 }; int turn = 0;  void *thread0_routine(void *arg) {     for (int i = 0; i < 1000000; ++i)     {         flag[0] = TRUE;         turn = 1;         while (TRUE == flag[1] && 1 == turn);          // 临阶区代码         num++;                   flag[0] = FALSE;     }          return NULL; }  void *thread1_routine(void *arg) {     for (int i = 0; i < 1000000; ++i)     {         flag[1] = TRUE;         turn = 0;         while (TRUE == flag[0] && 0 == turn);          // 临阶区代码         num++;                  flag[1] = FALSE;     }      return NULL; }

全局资源 num 的初始值为 0 ,两个编程分别递增 100 万次,因此最终结果应该是 200 万,实际测试结果也确实如此。

四、Mutex 互斥锁对代码执行效率的影响

1. 单线程中:Mutex 互斥锁对代码执行效率的影响

for (int i = 0; i < 1000000; ++i) {     num++; }

以上代码,耗时约:1.8ms -- 3.5ms。

for (int i = 0; i < 1000000; ++i) {     pthread_mutex_lock(&mutex);     num++;     pthread_mutex_unlock(&mutex); }

以上代码,耗时约:23.9ms -- 38.9ms。可以看出,上锁和解锁对代码执行效率的影响还是很明显的。

2. 多线程中:Mutex 互斥锁对代码执行效率的影响

void *thread0_routine(void *arg) {     for (int i = 0; i < 1000000; ++i)     {         pthread_mutex_lock(&mutex);         num++;         pthread_mutex_unlock(&mutex);     }          return NULL; }  void *thread1_routine(void *arg) {     for (int i = 0; i < 1000000; ++i)     {         pthread_mutex_lock(&mutex);         num++;         pthread_mutex_unlock(&mutex);     }      return NULL; }

耗时:

  • thread0: diff = 125.8ms

  • thread1: diff = 129.1ms

3. 在两个线程中,使用 Peterson 算法来保护临界区

耗时:

  • thread1: diff = 1.89ms

  • thread0: diff = 1.94ms

以上就是“C语言中如何利用软件代替Mutex互斥锁”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网其他教程频道。

--结束END--

本文标题: C语言中如何利用软件代替Mutex互斥锁

本文链接: https://www.lsjlt.com/news/287226.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中如何利用软件代替Mutex互斥锁
    今天小编给大家分享一下C语言中如何利用软件代替Mutex互斥锁的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前言在 Li...
    99+
    2023-06-17
  • C语言中怎么利用软件代替Mutex互斥锁
    本篇文章给大家分享的是有关C语言中怎么利用软件代替Mutex互斥锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、前言在 Linux  系统中,当多个线程并行执行时...
    99+
    2023-06-15
  • C语言中互斥锁与自旋锁及原子操作使用浅析
    目录互斥锁自旋锁原子操作实操结果互斥锁 临界区资源已经被1个线程占用,另一个线程过来访问临界资源的时候,会被CPU切换线程,不让运行后来的这个线程 适用于 锁住的内容多,(例如红黑数...
    99+
    2023-01-11
    C语言互斥锁 C语言自旋锁 C语言原子操作
  • C++软件如何实现中文语言支持?
    C++软件如何实现中文语言支持? 随着全球化的进程,越来越多的软件需要支持多语言,其中包括中文。在C++开发中,实现中文语言支持并不复杂,只需要一些基本的技巧和工具就可以轻松完成。本文...
    99+
    2024-04-02
  • 如何利用Go语言开发高效、稳定的软件?
    如何利用Go语言开发高效、稳定的软件? Go语言是一种由Google开发的开源编程语言,经过多年的发展,已经成为许多软件开发者喜爰的选择。Go语言具有丰富的标准库、高效的并发模型和快速...
    99+
    2024-04-02
  • 如何在go语言中利用反射精简代码
    这篇文章主要为大家分析了如何在go语言中利用反射精简代码的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“如何在go语言中利用反射精简代码”的知识吧。反射是 G...
    99+
    2023-06-05
  • C/C++中多进程之间的线程如何利用XSI IPC共享内存分配互斥量进行同步
    这篇文章主要介绍了C/C++中多进程之间的线程如何利用XSI IPC共享内存分配互斥量进行同步,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。#include <stdi...
    99+
    2023-06-03
  • c语言如何引用文件中的数据
    在C语言中,要引用文件中的数据,需要使用标准库中的文件操作函数。以下是一个简单的示例代码,演示了如何引用文件中的数据:```c#in...
    99+
    2023-09-08
    c语言
  • C语言中如何利用哈希表实现通讯录
    这篇“C语言中如何利用哈希表实现通讯录”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中如何利用哈希表实现通讯录”文章吧...
    99+
    2023-06-16
  • C语言中如何利用递归实现线索二叉树
    这篇“C语言中如何利用递归实现线索二叉树”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中如何利用递归实现线索二叉树”文...
    99+
    2023-06-17
  • C语言中如何利用指数函数进行数学运算
    C语言中如何利用指数函数进行数学运算 一、引言指数函数是数学中常用的函数之一,可以用于计算指数、对数、幂运算等。在C语言中,我们可以使用math.h头文件中提供的指数函数库来进行数学运...
    99+
    2024-02-22
    c语言 数学运算 指数函数
  • C语言中如何利用循环嵌套输出一个菱形
    目录利用循环嵌套输出一个菱形C语言输出半个菱形总结利用循环嵌套输出一个菱形 #include<stdio.h> int main() { int i, j; for...
    99+
    2023-02-06
    C语言循环嵌套 循环嵌套输出菱形 C语言循环
  • 如何在C语言中使用if语句处理多个条件?
    如何在C语言中使用if语句处理多个条件? 在C语言中,我们经常需要根据不同情况做出不同的处理。使用if语句可以帮助我们实现这一目的,而当需要处理多个条件时,可以结合if-else语句或...
    99+
    2024-04-02
  • C语言中如何利用and-or条件判断的特性来实现三元条件判断
    这篇文章主要介绍了C语言中如何利用and-or条件判断的特性来实现三元条件判断,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。利用and-or...
    99+
    2024-04-02
  • 中日翻译在线翻译如何利用日语翻译软件完成
    中日翻译在线翻译如何利用日语翻译软件完成?对于喜欢看日漫的朋友们来说,肯定都有一颗去日本旅游的心,但是去日本旅游首先我们要解决中日语翻译的问题。今天小编将要分享给大家一个方法,帮助大家快速完成中日语翻译。...
    99+
    2023-06-04
  • 如何使用C语言将数字、字符等数据写入、输出到文本文件中
    目录1.首先需要声明一个文件指针变量2.接下来需要对这个指针变量进行初始化3.然后开始利用相应函数将数据写入文件4.最后一步,也是关键的一步总结最近在调试程序,想把过程中需要查看的数...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作