多线程并发锁的方案—互斥锁

简介: 多线程并发锁的方案—互斥锁

解决线程中出现不正常的情况(多线程项目遗留问题)

解决问题的关键点:

理解count++的汇编代码过程如下:

//  count++ 汇编过程
mov [count], eax;      //count的值在内存中,移到寄存器当中
inc eax;               //寄存器自增
mov eax, [count];      //再将寄存器的值,移动到count中。

1.正常情况:

2.不正常的情况:

导致两个线程的自增只自增了一次,造成十个线程增加十万没有达到百万的原因。

互斥锁解决方案:

通过在每个线程前加锁,线程结束时解锁的方式。

代码如下:

#include <stdio.h>
#include <pthread.h>
#define THREAD_COUNT  10
pthread_mutex_t mutex;      //互斥锁定义
void *thread_callback(void *arg) {
  int *pcount = (int *)arg;
  int i = 0;
  while (i ++ < 100000) {
#if 0
    (*pcount) ++; //
#else
    pthread_mutex_lock(&mutex);
    (*pcount) ++; //
    pthread_mutex_unlock(&mutex);
#endif
    usleep(1);
  }
}
int main () {
  pthread_t threadid[THREAD_COUNT] = {0};
    pthread_mutex_init(&mutex, NULL);   //初始化,为NULL时为系统默认属性
  int i = 0;
  int count = 0;           //共享资源计数            
    //创建十个线程
  for (i = 0;i < THREAD_COUNT;i ++) {
        //带有四个参数 1.返回的线程id地址 2.线程的属性(堆、栈)3.xc入口函数 
        //4.主线程往子线程传的参数
    pthread_create(&threadid[i], NULL, thread_callback, &count);
  }
  for (i = 0;i < 100;i ++) {
    printf("count : %d\n", count);
    sleep(1);
  }
}

代码运行结果:

 

问题得以解决!

 

相关文章
|
12天前
|
存储 缓存 安全
JUC并发—11.线程池源码分析
本文主要介绍了线程池的优势和JUC提供的线程池、ThreadPoolExecutor和Excutors创建的线程池、如何设计一个线程池、ThreadPoolExecutor线程池的执行流程、ThreadPoolExecutor的源码分析、如何合理设置线程池参数 + 定制线程池。
JUC并发—11.线程池源码分析
|
4月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
314 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
1月前
|
数据采集 存储 网络协议
Java HttpClient 多线程爬虫优化方案
Java HttpClient 多线程爬虫优化方案
|
6月前
|
安全
List并发线程安全问题
【10月更文挑战第21天】`List` 并发线程安全问题是多线程编程中一个非常重要的问题,需要我们认真对待和处理。只有通过不断地学习和实践,我们才能更好地掌握多线程编程的技巧和方法,提高程序的性能和稳定性。
375 59
|
5月前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
421 2
|
6月前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
95 6
|
6月前
|
安全 Java
线程安全的艺术:确保并发程序的正确性
在多线程环境中,确保线程安全是编程中的一个核心挑战。线程安全问题可能导致数据不一致、程序崩溃甚至安全漏洞。本文将分享如何确保线程安全,探讨不同的技术策略和最佳实践。
106 6
|
6月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
155 8
|
5月前
|
Java 关系型数据库 MySQL
【JavaEE“多线程进阶”】——各种“锁”大总结
乐/悲观锁,轻/重量级锁,自旋锁,挂起等待锁,普通互斥锁,读写锁,公不公平锁,可不可重入锁,synchronized加锁三阶段过程,锁消除,锁粗化
|
6月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####

相关实验场景

更多