求助:单线程还死锁?

yoyoyang917 2010-06-12 02:46:28
程序是单线程,但是连接了一个.so动态库,这个库自己要起一个线程。
因此主线程和.so的线程共同操作同一个数据时就要加锁。
但是程序根本没有连接上.so,即只有主线程,还死锁了。
加锁和解锁只有一个地方,都是在同一个函数里,解锁之前没有任何return。
请大家帮忙解释下这种现象,给我点灵感,谢谢!


死锁的地方:
(gdb) bt
#0 0x0063a410 in __kernel_vsyscall ()
#1 0x00794379 in __lll_lock_wait () from /lib/libpthread.so.0
#2 0x0078fa2f in _L_lock_885 () from /lib/libpthread.so.0
#3 0x0078f8f6 in pthread_mutex_lock () from /lib/libpthread.so.0
#4 0x0804e849 in LockCheatMap () at AntiCheat.cpp:102
#5 0x0804e954 in DealCheatMap () at AntiCheat.cpp:217
#6 0x080f0f53 in main (argc=Cannot access memory at address 0x80
) at worldsv_main.cpp:283
...全文
464 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yoyoyang917 2010-06-12
[Quote=引用 17 楼 mqcy18 的回复:]

引用楼主 yoyoyang917 的回复:
程序是单线程,但是连接了一个.so动态库,这个库自己要起一个线程。
因此主线程和.so的线程共同操作同一个数据时就要加锁。
但是程序根本没有连接上.so,即只有主线程,还死锁了。
加锁和解锁只有一个地方,都是在同一个函数里,解锁之前没有任何return。
请大家帮忙解释下这种现象,给我点灵感,谢谢!

死锁的地方:
(gdb) bt
……
[/Quote]

就是linux运行的C程序,ctrl+c一下,再bt~
回复
mqcy18 2010-06-12
[Quote=引用楼主 yoyoyang917 的回复:]
程序是单线程,但是连接了一个.so动态库,这个库自己要起一个线程。
因此主线程和.so的线程共同操作同一个数据时就要加锁。
但是程序根本没有连接上.so,即只有主线程,还死锁了。
加锁和解锁只有一个地方,都是在同一个函数里,解锁之前没有任何return。
请大家帮忙解释下这种现象,给我点灵感,谢谢!

死锁的地方:
(gdb) bt
#0 0x0063a410 in __kerne……
[/Quote]
不懂,能告诉我这是用什么方法分析吗?不是C语言也不是汇编
回复
AlanBruce 2010-06-12
主线程如果是在加载库文件之前已经成功解锁临界资源,那么应该不是锁导致的

排除吧。。。
回复
yoyoyang917 2010-06-12
刚刚用valgrind检查了内存越界问题,当了,log如下,能确定当的地方是在这里吗,帮忙看看。

==3967== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==3967== Access not within mapped region at address 0xE38
==3967== at 0x804F1AC: std::less<unsigned>::operator()(unsigned const&, unsigned const&) const (stl_function.h:227)
==3967== by 0x80F1D67: dde_protocol_parser_bin32 (parser.c:145)
==3967== by 0x80FEB32: dde_proc_parser_queue (msg_que.c:546)
==3967== by 0x80F1239: dde_tcp_poll (core.c:146)
==3967== by 0x80F13F1: dde_heartbeat (core.c:166)
==3967== by 0x80AD922: mo_world_net_loop() (mo_network.cpp:467)
==3967== by 0x804A880: (within /data/Server/bin/world_dev)
回复
yoyoyang917 2010-06-12
[Quote=引用 13 楼 cattycat 的回复:]

主线程给数据加锁了吗,还是得等待动态库创建线程也给数据加锁,如果这个数据的话,动态库创建的线程肯定死锁了。
[/Quote]


主线程加了马上就放了,在同一个函数中。
回复
cattycat 2010-06-12
主线程给数据加锁了吗,还是得等待动态库创建线程也给数据加锁,如果这个数据的话,动态库创建的线程肯定死锁了。
回复
yoyoyang917 2010-06-12
再问一下,valgrind工具检查内存越界应该是写什么参数啊?
回复
yoyoyang917 2010-06-12
[Quote=引用 7 楼 cattycat 的回复:]

不是在调用__kernel_vsyscall 的时候挂了吗,可能是内核线程哪挂了吧
[/Quote]

程序运行时只要ctrl+c都会使在调用__kernel_vsyscall。
回复
yoyoyang917 2010-06-12
[Quote=引用 4 楼 xiaolinxianju 的回复:]

单线程死锁是不是因为死循环,或者之类的问题造成的?
[/Quote]
没有死循环。

__lll_lock_wait () 是表示死锁吗?
回复
z569362161 2010-06-12
原因很多,说不明白。
回复
oyster2008 2010-06-12
如果互斥量已经正确初始化的话,死锁只能是你在程序前面某个地方已经获取了锁了
回复
cattycat 2010-06-12
不是在调用__kernel_vsyscall 的时候挂了吗,可能是内核线程哪挂了吧
回复
huanmie_09 2010-06-12
分析一下程序出现死锁的可能性.
回复
philipzeng 2010-06-12
尝试一下去掉其他线程试试?
回复
xiaolinxianju 2010-06-12
单线程死锁是不是因为死循环,或者之类的问题造成的?
回复
yoyoyang917 2010-06-12
[Quote=引用 2 楼 pengzhixi 的回复:]

提示是main函数里面的参数有问题
[/Quote]

刚刚搜索了一下,好像只要程序挂了都会有argc=Cannot access memory at address~~,只是好像~~

太疑惑了,单线程死锁的条件是什么啊~
回复
pengzhixi 2010-06-12
提示是main函数里面的参数有问题
回复
yoyoyang917 2010-06-12
#6 0x080f0f53 in main (argc=Cannot access memory at address 0x80
)

这个可疑吗?
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2010-06-12 02:46
社区公告
暂无公告