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

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

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

解决问题的关键点:

理解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);
  }
}

代码运行结果:

 

问题得以解决!

 

相关文章
|
1月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
155 0
|
2月前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
44 2
|
23天前
|
安全
List并发线程安全问题
【10月更文挑战第21天】`List` 并发线程安全问题是多线程编程中一个非常重要的问题,需要我们认真对待和处理。只有通过不断地学习和实践,我们才能更好地掌握多线程编程的技巧和方法,提高程序的性能和稳定性。
128 59
|
14天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
1月前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
26 1
|
2月前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
1月前
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
34 1
|
1月前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
32 0
|
1月前
|
安全 调度 数据安全/隐私保护
iOS线程锁
iOS线程锁
26 0
|
1月前
|
Java API
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
32 0

热门文章

最新文章

相关实验场景

更多