Я создал сигнал тревоги в 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;
}
}
Но все равно программа вылетает. Может кто-нибудь объяснить мне, почему это происходит. Также было бы полезно, если бы кто-то мог объяснить мне хорошую реализацию разборки в таких случаях.