如何正确结束pthread?

时间:2019-01-21 05:40:15

标签: c++ pthreads destructor

我在c ++中创建了一个警报,该警报在while循环中检查条件。如果条件满足,它将调用一个函数。现在我面临的问题是,当我从该线程退出时,即通过退出while循环,我的程序崩溃了。

这是我的代码的概述:

alarm() {
 while(1) {
  for (auto i : condition) {
   do_something....
  }
  pthread_mutex_lock(&flag_mutex_);
  if (condition) break;
  pthread_mutex_unlock(&flag_mutex_);
 }
}

现在条件由父线程中的析构函数设置。

~Destructor() {
 pthread_mutex_lock(&flag_mutex_);
 MLOG << "Thread is going to end!" << nl;
 is_stopped_ = true;
 pthread_mutex_unlock(&flag_mutex_);
}

此崩溃。日志如下:

/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f1b4302c7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f1b4303537a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f1b4303953c]
./test_scheduler[0x4039e4]
./test_scheduler[0x4037b0]
./test_scheduler[0x403232]
./test_scheduler[0x4033b4]
./test_scheduler[0x402dd3]
./test_scheduler[0x402984]
./test_scheduler[0x4020fd]
./test_scheduler[0x402361]
./test_scheduler[0x402564]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba)[0x7f1b433866ba]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7f1b430bc41d]
======= Memory map: ========
00400000-00406000 r-xp 00000000 08:13 6684908                            /media/midhun/SSD/ScheduleRecording/test_scheduler
00605000-00606000 r--p 00005000 08:13 6684908                            /media/midhun/SSD/ScheduleRecording/test_scheduler
00606000-00607000 rw-p 00006000 08:13 6684908                            /media/midhun/SSD/ScheduleRecording/test_scheduler
020ec000-0211e000 rw-p 00000000 00:00 0                                  [heap]
7f1b3c000000-7f1b3c021000 rw-p 00000000 00:00 0 
7f1b3c021000-7f1b40000000 ---p 00000000 00:00 0 
7f1b424ab000-7f1b424ac000 ---p 00000000 00:00 0 
7f1b424ac000-7f1b42cac000 rw-p 00000000 00:00 0 
7f1b42cac000-7f1b42db4000 r-xp 00000000 08:02 10490492                   /lib/x86_64-linux-gnu/libm-2.23.so
7f1b42db4000-7f1b42fb3000 ---p 00108000 08:02 10490492                   /lib/x86_64-linux-gnu/libm-2.23.so
7f1b42fb3000-7f1b42fb4000 r--p 00107000 08:02 10490492                   /lib/x86_64-linux-gnu/libm-2.23.so
7f1b42fb4000-7f1b42fb5000 rw-p 00108000 08:02 10490492                   /lib/x86_64-linux-gnu/libm-2.23.so
7f1b42fb5000-7f1b43175000 r-xp 00000000 08:02 10490422                   /lib/x86_64-linux-gnu/libc-2.23.so
7f1b43175000-7f1b43375000 ---p 001c0000 08:02 10490422                   /lib/x86_64-linux-gnu/libc-2.23.so
7f1b43375000-7f1b43379000 r--p 001c0000 08:02 10490422                   /lib/x86_64-linux-gnu/libc-2.23.so
7f1b43379000-7f1b4337b000 rw-p 001c4000 08:02 10490422                   /lib/x86_64-linux-gnu/libc-2.23.so
7f1b4337b000-7f1b4337f000 rw-p 00000000 00:00 0 
7f1b4337f000-7f1b43397000 r-xp 00000000 08:02 10490568                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7f1b43397000-7f1b43596000 ---p 00018000 08:02 10490568                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7f1b43596000-7f1b43597000 r--p 00017000 08:02 10490568                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7f1b43597000-7f1b43598000 rw-p 00018000 08:02 10490568                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7f1b43598000-7f1b4359c000 rw-p 00000000 00:00 0 
7f1b4359c000-7f1b435b2000 r-xp 00000000 08:02 10490460                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f1b435b2000-7f1b437b1000 ---p 00016000 08:02 10490460                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f1b437b1000-7f1b437b2000 rw-p 00015000 08:02 10490460                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f1b437b2000-7f1b43924000 r-xp 00000000 08:02 12067631                   /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f1b43924000-7f1b43b24000 ---p 00172000 08:02 12067631                   /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f1b43b24000-7f1b43b2e000 r--p 00172000 08:02 12067631                   /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f1b43b2e000-7f1b43b30000 rw-p 0017c000 08:02 12067631                   /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f1b43b30000-7f1b43b34000 rw-p 00000000 00:00 0 
7f1b43b34000-7f1b43b5a000 r-xp 00000000 08:02 10490394                   /lib/x86_64-linux-gnu/ld-2.23.so
7f1b43d2a000-7f1b43d30000 rw-p 00000000 00:00 0 
7f1b43d58000-7f1b43d59000 rw-p 00000000 00:00 0 
7f1b43d59000-7f1b43d5a000 r--p 00025000 08:02 10490394                   /lib/x86_64-linux-gnu/ld-2.23.so
7f1b43d5a000-7f1b43d5b000 rw-p 00026000 08:02 10490394                   /lib/x86_64-linux-gnu/ld-2.23.so
7f1b43d5b000-7f1b43d5c000 rw-p 00000000 00:00 0 
7ffc19415000-7ffc19436000 rw-p 00000000 00:00 0                          [stack]
7ffc195b9000-7ffc195bc000 r--p 00000000 00:00 0                          [vvar]
7ffc195bc000-7ffc195be000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
[1]    6980 abort (core dumped)  ./test_scheduler

现在我认为这可能是因为我没有解锁互斥锁,所以我更新了这样的线程功能。

alarm() {
 while(1) {
  for (auto i : condition) {
   do_something....
  }
  pthread_mutex_lock(&flag_mutex_);
  if (condition) {
    stop = true;
  }
  pthread_mutex_unlock(&flag_mutex_);
  if (stop)
   break;
 }
}

但是程序仍然崩溃。有人可以向我解释为什么会这样。在这种情况下,如果有人可以向我解释一些不错的拆卸实施方式,也会很有帮助。

0 个答案:

没有答案