多线程加锁

为什么多线程读写 shared_ptr 要加锁? 为什么多线程读写 shared_ptr 要加锁?陈硕(giantchen_AT_gmail_DOT_com)2012-01-28最新版下载:http://chenshuo.googlecode.com/files/CppEngineering.pdf我在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道:(shared_ 阅读详情

Linux pthread_mutex演示程序

Linux  下pthread  中使用mutex  进行互斥的程序和结果

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "pthread.h"


#define THREAD_NUMBER 2

int sum =  0;

void* fun( void* arg) {
     int t = (*( int*)arg);
     int i;
     for (i = t ;i <  10000; i +=  2)
        sum = sum + i;
     return NULL;
}

int main(){
    pthread_t T[THREAD_NUMBER];
     int arg[THREAD_NUMBER];
     int ret,i;
     void* join_result;
    
     for (i = 0 ;i < THREAD_NUMBER; ++ i){
        arg[i] = i;
        ret = pthread_create(&T[i],NULL,fun,( void*)&arg[i]);
         if (ret){
            printf( "Thread %d crreate failure! \n ",i);
            exit(EXIT_FAILURE);
        }
    }
     for (i =  0 ;i < THREAD_NUMBER; ++ i){
        ret = pthread_join(T[i],&join_result);
         if (ret) {
            printf( "Thread %d join failure! \n ",i);
            exit(EXIT_FAILURE);
        }
    }
    printf( "sum = %d \n ",sum);
     return  0;
}

上面的程序是没有进行互斥的 nomutex.c  该程序用于求  1.. .9999 的和,可以gcc -l pthreacd -o test nomutex.c 编译该程序,
并且可以实验运行结果基本上都是不对的,由于该程序没有应用互斥操作,所以可想而知为什么结果是不对的。

下面的程序就在上面程序的基础上加上了求和时的互斥操作,所以运行结果都是对的。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "pthread.h"


#define THREAD_NUMBER 2

int sum =  0;

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* fun( void* arg) {
     int t = (*( int*)arg);
     int i;
     for (i = t ;i <  10000; i +=  2) {
        pthread_mutex_lock(&mutex);
        sum = sum + i;
        pthread_mutex_unlock(&mutex);
    }
     return NULL;
}

int main(){
    pthread_t T[THREAD_NUMBER];
     int arg[THREAD_NUMBER];
     int ret,i;
     void* join_result;
    
     for (i = 0 ;i < THREAD_NUMBER; ++ i){
        arg[i] = i;
        ret = pthread_create(&T[i],NULL,fun,( void*)&arg[i]);
         if (ret){
            printf( "Thread %d crreate failure! \n ",i);
            exit(EXIT_FAILURE);
        }
    }
     for (i =  0 ;i < THREAD_NUMBER; ++ i){
        ret = pthread_join(T[i],&join_result);
         if (ret) {
            printf( "Thread %d join failure! \n ",i);
            exit(EXIT_FAILURE);
        }
    }
    printf( "sum = %d \n ",sum);
     return  0;
}
用这两个小程序,只是想演示一下linux 下pthread  的互斥操作。可以看到,在多线程环境中,为了保证共享变量的值的正确性,
互斥是非常重要的。



我觉得应该加锁。理由如下:
     比如说有多个线程都要读一个文件。
     先要open 打开一个文件,得到一个fd

对任一个读线程来说操作如下:
     1. lseek(fd..)到适当的位置
     2. read(fd..)

虽然以上每一个都是原子操作,可是1,2之间是可以中断的。如果线程一lseek了之后,系统暂时挂起线程1,运行线程二,线程也调用lseek。

内核给每一个进程有一个进程描述结构,在Linux中task_struct,在FreeBSD中是proc,存放每一个进程的信息。(下面以FreeBSD为例,因为linux不太清楚,原理应该是一样的).
proc里有一个struct filedesc,这里存放一个进程所有打开的文件的信息。它里面有一个struct file的表,每一个表表示这个进程一个打开文件。struct file里面记录了调用lseek设定的这个文件offset大小,对这个文件的读写都是从这里开始的。也就是说这个offset实际上是进程的各个线程共享的。
如果出现像上面说的那种情况,线程一设定的offset就被线程二给修改了。当线程一再开始运行的时候,读到的数据肯定是错误的。

所以说,为了数据的正确性,多线程读一个文件也应该加锁。


C++多线程加锁/线程池使用 1.多线程加锁 #include <mutex> mutex mut; mut.lock (); mut.unlock (); 以下代码执行结果为200000000,证明没有发生val被一个线程获取处理还没写回的时候,被另一个线程读走。 如果不加锁,val的结果会是100000000到200000000之间的一个数。 #include <iostream> #include <thread> #include <mutex> using name 阅读详情

相关推荐

SAP FICO 银企直联实战:从配置到异常处理的全流程解析

本文详细解析了SAP FICO银企直联的实战配置与异常处理全流程,涵盖银行主数据搭建、支付类配置、银行接口适配等关键步骤。通过实际案例分享,帮助用户掌握实时付款、余额监控和自动对账等核心功能,提升企业财务效率与安全性。特别针对常见问题如凭证重复付款、前置机UUID冲突等提供了实用解决方案。

weixin_29215815的博客 664

VS中怎么实现锁定多线程中某一特定线程调试

B站视频。

Aiden_Su的博客 578

Cadence——原理图相关教程

包含创建文件,原理图,元器件,规则检查,PDF与BOM清单输出,各类PCB网表

haonanyayaya的博客 1万+

多线程 加锁

线程同步 对多线程来说,资源是共享的,基本上不存在不允许访问的情况,但是,共享的资源在某一时间点只能有一个线程占用,所以需要给资源加锁。 线程的锁的种类 互斥锁 读写锁 条件变量 自旋锁 信号灯 互斥锁 互斥锁机制是同一时刻只允许一个线程占有共享的资源。 初始化锁 intpthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutex_attr_t*mutexattr); 参数 mutexattr 用于指定锁的属性(见下)...

Sarah_212的博客 4109

vscode中创建vue快捷键

1.安装Vetur插件(扩展里面直接搜) 2.vscode 界面里面左上角选则 文件=> 首选项=> 用户代码片段=>新建全局代码片段=>在输入框中新建名称为vue.json 3.删除里面的注释,当然你也可以留着,把下面的代码粘贴进去! { // Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // descri

Leon_940002463的博客 3207

RJ45以太网接口EMC设计方案

RJ45以太网接口EMC设计方案 一、 接口概述 RJ45以太网接口是目前应用最广泛的通讯设备接口,以太网口的电磁兼容性能关系到通讯设备的稳定运行。赛盛技术应用电磁兼容设计平台(EDP)软件从接口原理图、结构设计,线缆设计三个方面来设计以太网口的EMC设计方案。 二、 接口电路 原理图的EMC设计 百兆以太网接口2KV防雷滤波设计 图1 百兆以太网接口2KV防雷滤波设计 接口电路设计概述: 本方案从EMC原理上,进行了相关的抑制干扰和抗敏感度的设计;从设计层次解决EMC问题;同时此电路兼容了百兆以太网接

兰陵笑笑生SD的博客 1万+

多线程中的锁

在了解什么是锁之前,我们先来看一下这样一段代码//创建变量i//我们创建两个线程,分别让i自增10000次j < 10000;j++) {i++;});j < 10000;j++) {i++;});t1.start();t2.start();try {//等待两个线程执行完成t2.join();t1.join();//打印i的值按照正常的逻辑,两个线程都让i自增了10000次,i最终的结果应该是20000才对,但事实真是如此吗?我们来看一下代码的运行结果。

qq_66292058的博客 2201

WPS Office 2026免费安装指南:AI办公与安全使用全解析

办公软件作为数字化办公的核心工具,其基本原理是通过文档处理、数据计算和演示展示等功能模块满足用户日常办公需求。随着人工智能技术的发展,现代办公软件逐步集成AI能力,通过自然语言处理和数据分析算法提升工作效率。在技术价值层面,优秀的办公软件不仅需要保持格式兼容性和跨平台同步能力,更要注重用户数据安全防护。从应用场景来看,无论是个人文档编辑、企业报表分析还是团队协作演示,办公软件都发挥着关键作用。WPS Office 2026作为国产办公软件代表,深度融合AI助手功能,支持智能写作和数据分析,同时通过官方免费策

weixin_30599769的博客 729

带你彻底了解多线程锁策略(未完待续)

带你彻底了解多线程的锁策略,一篇文章全部搞懂!!!!!

zhaolk的博客 721

【乐企-工具篇】生成发票左上角二维码

【代码】【乐企-业务篇】生成发票左上角二维码。

九七的博客 708

SAP UI5 本地开发工具 fiori-tools-proxy 中间件详解及使用场景

该中间件基于 http-proxy-middleware 库实现,分为 ui5 资源代理和 backend 代理两大模式,并可与 fiori run 或 ui5 serve 命令无缝集成,通过配置 ui5.path、ui5.url 以及 backend.path、backend.url 等参数,实现与目标系统的灵活对接和安全配置 (就后端系统代理而言,fiori-tools-proxy 内置 @sap-ux/backend-proxy-middleware,可将以指定前缀(如。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 519

线程加锁关键字

加锁关键字

qq_774952435的博客 1780

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java 多线程加锁

java 加锁方法: 1:直接加 synchronized 关键字 2:使用lock private java.util.concurrent.locks.Lock lock = new ReentrantLock(); private void fun(){ lock.lock(); try{ 执行语句...... } finally{ lock.unlock(); } } 例子: 生成订单号,此处是由时间戳 public clas...

一个抽风的女Ren的博客 2363

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

关于多线程加锁问题

偶然间翻到了多线程加锁的帖子,记录一下 多线程间共享变量加不加锁取决于变量类型以及大小,跟CPU单次操作有关。 从:https://blog.youkuaiyun.com/youtherzhang/article/details/76093570 大神的测试结果来看(感谢大神的这么详细的测试数据) 结论: 1.对于int,short,char,BOOL等小于等于4字节的简单数据类型,如果无逻辑上的先后...

wai371447806的博客 2173

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

多线程加锁练习

未加锁的多线程: package SYN; //不安全的取钱 public class UnsafeBank { public static void main(String[] args) { Account account = new Account(100, "结婚基金"); Drawing you = new Drawing(account, 50, "你"); Drawing girlFriend = new Drawing(account

weixin_44096353的博客 184

java多线程变量 加锁

Java多线程变量加锁实现方法 简介 在多线程开发中,为了保证线程安全,经常需要对共享变量进行加锁操作。本文将介绍如何在Java中实现多线程变量的加锁操作,以保证数据的一致性和可靠性。 流程图 多线程变量加锁实现流程#render_12_489205665-svg{font-family:"trebuchet ms",ve...

weixin_42089264的博客 296

java 给指定线程加锁_java多线程加锁是对谁加锁?

1.java多线程加锁是对谁加锁?答:当然是对共享资源加锁啊,对谁进行访问修改,就对象进行加锁。以便使多线程按序访问此共享对象比如:在具体的Java代码中需要完成一下两个操作:把竞争访问的资源类Foo变量x标识为private;同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。package cn.thread;public class Foo2 {private int ...

weixin_39577052的博客 392

python_多线程加锁

python3多线程可以不加锁,每个多线程就自带锁 python2多线程必须加锁,多线程本身不带锁 加锁有两种方式,一种如下图: import time, threading count=0 #声明全局变量 lock=threading.Lock() #申请一把锁 def lajifenlei(): global count #引用全局变量 loc...

weixin_30883311的博客 321

c++多线程thread操作(五)unique_lock加锁

(一)加锁的三种方式: 1. mutex原生: mutex<int>mu; mu.lock(); // ...执行代码段 mu.unlock(); 优点:可以解决数据竞争; 缺点:如果执行代码段抛出异常,mu锁将永远被锁住,无法释放; 2. lock_guard加锁 mutex<int>mu; lock_guard<mutex> guard(mu);// guard析构时自动释放锁 // ...执行代码段 优点:可以解决mutex原生下的异常问题,gua

BearLeer的博客 4220

多线程程序写日志时遇到加锁的问题

前段时间在做项目时,系统是个多线程程序,几个线程都需要写日志,主线程和通讯线程经常在写日志时打架,为了解决这个问题,考虑在写日志的方法中加锁。代码如下:    /// <summary> /// 写日志时加锁 /// </summary> private static object m_Lock = new object...

weixin_34384915的博客 404

多线程加锁问题

之前遇到过的问题 1.多线程对ArrayList赋值 import java.util.ArrayList; /** * Created by w on 2019/8/13. * * 正常是200万 * * 可能存在的问题: * * 1.Thread-0" java.lang.ArrayIndexOutOfBoundsException: 73 * * ArrayLi...

Grace 602

java 静态 多线程_Java中实例方法和静态方法在多线程下加锁和不加锁

第一个例子是同一实例方法加锁和不加锁在多线程情况下的访问情况,代码如下:package test.caipiao.log;/*** 一个类的同一个实例,方法加锁和不加锁情况下的访问情况.* @author lfl**/public class Test {public static void main(String[] args) {final TT tt = new TT();Thread t1...

weixin_32927369的博客 524

Python3多线程Lock加锁范例

python多线程加锁范例

dong6016的博客 885

Java多线程加锁例子

Java多线程加锁例子一、错误示例二、正确示例 一、错误示例 static int a = 0; //多线程同时操作 val a @Test public void test4() throws InterruptedException { Runnable runnable = () -> { while (a < 10) { a++; System.out.print(a + "\t"); }

qq_30603317的博客 1322
上一篇: 文件加锁
下一篇: pthread参数传递
ffeng271
博客等级 码龄19年 139粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值