本文依据目前工作场景中程序运行出现的错误罗列至此,后续持续更新。
(1) Thread 1 "wow_base_test" received signal SIGILL, Illegal instruction.
错误追踪
(gdb) backtrace
#0 __lll_unlock_elision (lock=0x7fffffffe250, private=0) at ../sysdeps/unix/sysv/linux/x86/elision-unlock.c:29
#1 0x00007ffff7fbb63b in wow_mutex_unlock (lock=0x7fffffffe250) at /home/wow/open/wow-iot7/wow_base/src/system/wow_lock.c:125
#2 0x000055555555abda in test_lock_mutex () at /home/wow/open/wow-iot7/wow_base/test/system/suit_lock.c:155
#3 0x000055555555ae7a in suit_lock () at /home/wow/open/wow-iot7/wow_base/test/system/suit_lock.c:217
#4 0x000055555555891d in greatest_run_suite (suite_cb=0x55555555adc7 <suit_lock>, suite_name=0x5555555603a5 "suit_lock")
at /home/wow/open/wow-iot7/wow_base/test/main.c:27
#5 0x0000555555559551 in main (argc=1, argv=0x7fffffffe3d8) at /home/wow/open/wow-iot7/wow_base/test/main.c:41
代码段:
TEST test_lock_mutex(void)
{
printf(MOD_TAG"suit_lock----test_lock_mutex\n");
mutex_lock_t lock;
gi_threadFlag = 1;
wow_thread_create(MOD_TAG,mutex_lock_thread,&lock);
wow_thread_create(MOD_TAG,mutex_unlock_thread,&lock);
sleep(10);
gi_threadFlag = 0;
wow_mutex_unlock(&lock);
sleep(3);
///<这里 !!不要去解锁一个未被加锁的mutex锁
wow_mutex_unlock(&lock);
PASS();
}
线程锁使用注意事项:
1、不要去解锁一个未被加锁的mutex锁;
2、不要一个线程中加锁而在另一个线程中解锁;
3、使用mutex锁用于保护临界资源,严格按照“加锁-->写入/读取临界资源-->解锁”的流程执行,对于线程间同步的需求使用条件变量或信号量实现。