热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++11多线程:Valgrind未初始化的值警告

如何解决《C++11多线程:Valgrind未初始化的值警告》经验,为你挑选了1个好方法。

我使用gcc 8.2.1在Linux下编译了以下虚拟程序:

#include 
#include 
#include 

struct Foo
{
  void start() {
    thread = std::thread(&Foo::run, this);
  }

  void stop() {
    mutex.lock();
    dOne= true;
    mutex.unlock();

    thread.join();
  }

  void run() {
    bool tmp;

    for (;;) {
      mutex.lock();
      tmp = done;
      mutex.unlock();

      if (tmp)
        break;
    }
  }

  std::thread thread;
  std::mutex mutex;
  bool done;
};

int main()
{
  Foo foo;

  std::cout <<"starting...\n";
  foo.start();

  std::cout <<"stopping...\n";
  foo.stop();

  std::cout <<"done\n";
}

如果我随后在valgrind 3.14.0下运行它,我会收到以下警告:

==30060== Thread 2:
==30060== Conditional jump or move depends on uninitialised value(s)
==30060==    at 0x1095F3: Foo::run() (in /.../a.out)
==30060==    by 0x109AAE: void std::__invoke_impl(std::__invoke_memfun_deref, void (Foo::*&&)(), Foo*&&) (in /.../a.out)
==30060==    by 0x109771: std::__invoke_result::type std::__invoke(void (Foo::*&&)(), Foo*&&) (in /.../a.out)
==30060==    by 0x10A012: decltype (__invoke((_S_declval<0ul>)(), (_S_declval<1ul>)())) std::thread::_Invoker >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) (in /.../a.out)
==30060==    by 0x109FB8: std::thread::_Invoker >::operator()() (in /.../a.out)
==30060==    by 0x109F8D: std::thread::_State_impl > >::_M_run() (in /.../a.out)
==30060==    by 0x496A062: execute_native_thread_routine (thread.cc:80)
==30060==    by 0x4894A9C: start_thread (in /usr/lib/libpthread-2.28.so)
==30060==    by 0x4CD7A42: clone (in /usr/lib/libc-2.28.so)

我不完全确定导致这种情况的原因,我已经编写了这段代码,希望能够诊断一个更复杂的类中的错误(我不能在这里发布)我正在研究并且在调用等效的时候产生异常Foo::stop().valgrind警告是否意味着我对C++线程接口有一些严重的误解?并假设片刻Foo::run实际上会做一些有用的事情,我怎么能修复这个程序,同时保持Foo接口的方式呢?



1> rafix07..:

什么是初始值bool done;?它是不确定的(一些垃圾值),所以你的thread(run)可以在没有调用stop方法的情况下停止.

done 必须初始化:

  //...
  std::mutex mutex;
  bool dOne= false; // <--


推荐阅读
  • Threadtowaitinfinitelyinaloopuntilaflagstatechange,thencallfunction.线程在循环中无限期等待,直到标志状 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Linux 中使用 clone 函数来创建线程
    2019独角兽企业重金招聘Python工程师标准Linux上创建线程一般使用的是pthread库实际上libc也给我们提供了创建线程的函数那就是cloneintclone(i ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • Linux线程的同步和互斥
    目录1、线程的互斥2、可重入VS线程安全3、线程的同步1、线程的互斥 ... [详细]
  • golang源码分析调度概述
    golang源码分析-调度过程概述本文主要概述一下golang的调度器的大概工作的流程,众所周知golang是基于用户态的协程的调度来完成多任务的执行。在Linux ... [详细]
  • ARMLinux内核知识点
    ARM-Linux内核知识点文章目录ARM-Linux内核知识点前言一、概述二、ARM-Linux内核的主要架构及功能三、Linux内核源码目录结构四、ARM-Linux进程管理五 ... [详细]
  • 不知道你是否还记得之前在进程中的信号处理时,提到过阻塞信号集与未决信号集的概念,如果你已经忘记了,请参考《阻塞信号与未决信号》一文回忆一下 ... [详细]
  • C语言编程gcc怎么生成静态库.a和动态库.so
    这篇文章将为大家详细讲解有关C语言编程gcc怎么生成静态库.a和动态库.so,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
author-avatar
Mr_cool
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有