c++ - 当另一个线程正在运行时,线程连接会导致段错误

标签 c++ multithreading c++11 process

我有这个方法:

void Process::launch()
{
  std::thread readThread(&Process::readInfo, this);
  std::thread writeThread(&Process::writeInfo, this);

  readThread.join();
  this->_finished = true;
  writeThread.join();

  delete this->_namedPipeWrite;
  delete this->_namedPipeRead;
  std::cout << "No segmentation fault here" << std::endl;
  std::cout << "Segfault here" << std::endl;
  delete this->_threadPool;
  std::cout << "Never arrives here" << std::endl;
  _Exit(0);
}

当我尝试 delete this->_threadPool 时出现哪个段错误

threadPool 的析构函数是这样做的:

 {
    std::unique_lock<std::mutex> lock(this->_mutex);

    this->_shutDown = true;
  }

  this->_cond.notify_all();

  for(std::thread &thread : this->_threadList)
  {
    thread.join();
  }

  this->_threadList.empty();
  this->_finished = true;
  delete this->_functionMutexes;

段错误发生在 join() 处。

我这样声明我的线程池:

  this->_finished = false;
  this->_shutDown = false;
  this->_functionMutexes = new std::vector<std::mutex>(numberOfThreads);
  for(int i = 0; i < numberOfThreads; ++i)
  {
    this->_threadList.emplace_back(std::thread(&ThreadPool::task, this));
  }

这是 valgrind :

==28174== Process terminating with default action of signal 11 (SIGSEGV)
==28174==  Access not within mapped region at address 0x99CD9D0
==28174==    at 0x4E3D600: pthread_join (pthread_join.c:45)
==28174==    by 0x540EE46: std::thread::join() (in /usr/lib64/libstdc++.so.6.0.21)
==28174==    by 0x4063F0: ThreadPool<int>::shutDown() (ThreadPool.cpp:52)
==28174==    by 0x406299: ThreadPool<int>::~ThreadPool() (ThreadPool.cpp:21)
==28174==    by 0x410B62: Process::launch() (Process.cpp:56)
==28174==    by 0x410873: Process::Process(int) (Process.cpp:24)
==28174==    by 0x40CC87: ProcessManager::addOrder(std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) (in /home/danilo_d/Epitech-Projects/Semestre4/cpp_plazza/plazza)
==28174==    by 0x405934: main (in /home/danilo_d/Epitech-Projects/Semestre4/cpp_plazza/plazza)
==28174==  If you believe this happened as a result of a stack
==28174==  overflow in your program's main thread (unlikely but
==28174==  possible), you can try to increase the size of the
==28174==  main thread stack using the --main-stacksize= flag.
==28174==  The main thread stack size used in this run was 8388608.

这个线程池工作正常,我已经测试过了。

有一些奇怪的行为发生。

-如果我删除行

  this->_writeThread = new std::thread(&Process::writeInfo, this);

和他的 join ,我没有段错误。

-如果我删除 delete this->_threadPool,我仍然是 segfaut,但 valgrind 没有检测到它。

知道是什么原因造成的吗?

最佳答案

我认为您的问题来自于您的一个线程从未加入这一事实。验证您的整个代码并确保加入每个线程。

关于c++ - 当另一个线程正在运行时,线程连接会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36809217/

相关文章:

c++11 - 这是 std::underlying_type 的错误吗

c++ - 将 volatile 数据与未为 volatile 数据重载的方法一起使用

c++ - g++:如果在-O2或-O3之前指定-fno-omit-frame-pointer是否有效?

java - 为什么hypot()函数这么慢?

c# - ConfigureAwait 并将异步调用与同步调用混合

java - 多线程和队列

c++ - STL 容器在该类的声明中持有类

C++ 奇怪输出的 Python 复数

c - 线程开销性能

c++ - 为什么 C++ numeric_limits<enum_type>::max() == 0?