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