Как правильно завершить pthread? - PullRequest
0 голосов
/ 21 января 2019

Я создал сигнал тревоги в 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;
 }
}

Но все равно программа вылетает. Может кто-нибудь объяснить мне, почему это происходит. Также было бы полезно, если бы кто-то мог объяснить мне хорошую реализацию разборки в таких случаях.

...