亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 5637 | 回復(fù): 16
打印 上一主題 下一主題

[C] 多線程死鎖了,給下gdb日志,幫我分析下 [復(fù)制鏈接]

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2016-01-09 10:46 |只看該作者 |倒序?yàn)g覽
本帖最后由 jd808 于 2016-01-09 10:48 編輯
  1. (gdb) info threads
  2.   Id   Target Id         Frame
  3.   7    Thread 0x7f82e25eb700 (LWP 24196) "Xgateway" __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  4.   6    Thread 0x7f82e1dea700 (LWP 24197) "Xgateway" __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  5.   5    Thread 0x7f82e15e9700 (LWP 24198) "Xgateway" __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  6.   4    Thread 0x7f82e0de8700 (LWP 24199) "Xgateway" __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  7.   3    Thread 0x7f82e05e7700 (LWP 24200) "Xgateway" __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  8.   2    Thread 0x7f82dfde6700 (LWP 24201) "Xgateway" 0x00007f82e26a948d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
  9. * 1    Thread 0x7f82e3ea7740 (LWP 24195) "Xgateway" __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  10. (gdb) thread 1
  11. [Switching to thread 1 (Thread 0x7f82e3ea7740 (LWP 24195))]
  12. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  13. 135        2:        movl        %edx, %eax
  14. (gdb) bt
  15. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  16. #1  0x00007f82e3a83d32 in _L_lock_791 () from /lib64/libpthread.so.0
  17. #2  0x00007f82e3a83c38 in __GI___pthread_mutex_lock (mutex=0x1cb04f8) at pthread_mutex_lock.c:64
  18. #3  0x0000000000415709 in TServer::CloseEvent (this=<optimized out>, conn=0x1cb0370, events=<optimized out>)
  19.     at gateway/src/TServer.cpp:340
  20. #4  0x00007f82e36001ee in bufferevent_readcb (fd=20, event=<optimized out>, arg=0x1ca4500) at bufferevent_sock.c:196
  21. #5  0x00007f82e3605849 in event_persist_closure (ev=<optimized out>, base=0x1ca15c0) at event.c:1531
  22. #6  event_process_active_single_queue (base=base@entry=0x1ca15c0, activeq=0x1badc90, max_to_process=max_to_process@entry=2147483647,
  23.     endtime=endtime@entry=0x0) at event.c:1590
  24. #7  0x00007f82e36060ff in event_process_active (base=0x1ca15c0) at event.c:1689
  25. #8  event_base_loop (base=0x1ca15c0, flags=0) at event.c:1912
  26. #9  0x0000000000414e01 in MultiServer::StartRun (this=0x1c53880) at gateway/src/MultiServer.cpp:329
  27. #10 0x000000000041ce52 in TControl::Run (this=this@entry=0x7fff7eaf4ab0) at gateway/src/TControl.cpp:30
  28. #11 0x00000000004060e0 in main (argc=1, argv=0x7fff7eaf4bc8) at gateway/src/node_gateway.cpp:64
  29. (gdb) thread 3
  30. [Switching to thread 3 (Thread 0x7f82e05e7700 (LWP 24200))]
  31. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  32. 135        2:        movl        %edx, %eax
  33. (gdb) bt
  34. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  35. #1  0x00007f82e3a83d32 in _L_lock_791 () from /lib64/libpthread.so.0
  36. #2  0x00007f82e3a83c38 in __GI___pthread_mutex_lock (mutex=0x1cb04f8) at pthread_mutex_lock.c:64
  37. #3  0x0000000000406869 in TEngine::Base_Client_Lock (this=0x1cad670, send_conn=0x1cb0370, command=0x7f82e05e6bf0 "\031\260!",
  38.     size=52, is_zip=1) at gateway/src/TEngine.cpp:113
  39. #4  0x000000000040766c in TUserEngine::send_map_xy_client (this=<optimized out>, pcon=<optimized out>, Build_conn=<optimized out>,
  40.     command=<optimized out>, cmdlen=<optimized out>, send_count=<optimized out>) at gateway/src/TUserEngine.cpp:794
  41. #5  0x00000000004131ec in operator() (__args#4=0x7f82e05e6bac, __args#3=52, __args#2=0x7f82e05e6bf0 "\031\260!", __args#1=0x1cb0370,
  42.     __args#0=<optimized out>, this=0x7f82e05e6bd0) at /usr/include/c++/4.8.2/tr1/functional:2146
  43. #6  BaseTEngine::CallConnList(std::tr1::function<int (Conn*, Conn*, char const*, int, void*)>, Conn*, char const*, int, void*) (
  44.     this=this@entry=0x1cad670, f=..., ActConn=ActConn@entry=0x1cb0370, command=command@entry=0x7f82e05e6bf0 "\031\260!",
  45.     cmdlen=cmdlen@entry=52, n=n@entry=0x7f82e05e6bac) at gateway/src/BaseTEngine.cpp:166
  46. #7  0x0000000000409380 in TUserEngine::_MoveXY (this=this@entry=0x1cad670, x=x@entry=211, y=y@entry=2414, pint AddToWriteBuffer(const void *buffer, int len)
  47.     {
  48. //                m_WriteBuf = bufferevent_get_output(m_bev);
  49.                 //printf("m_WriteBuf[%p]\n", m_WriteBuf);
  50.             if(fd_type>0 && m_WriteBuf!=NULL) {
  51.                         int res = evbuffer_add(m_WriteBuf, buffer, len);
  52. //                        int res = bufferevent_write(m_bev, buffer, len);//這個和上面evbuffer_add是一樣的
  53.                         return res;

  54.                 }
  55.                 else
  56.                         return -1;
  57.     }arameter=1,
  58.     hero_user_id=-1) at gateway/src/TUserEngine.cpp:643
  59. #8  0x00000000004093f7 in TUserEngine::moveXY (this=this@entry=0x1cad670,
  60.     command=command@entry=0x7f82c8006104 <incomplete sequence \323>, DataLen=DataLen@entry=16) at gateway/src/TUserEngine.cpp:592
  61. #9  0x000000000040aa76 in TUserEngine::ExecCmd (this=this@entry=0x1cad670, command=0x7f82c8006104 <incomplete sequence \323>,
  62.     DataLen=DataLen@entry=16) at gateway/src/TUserEngine.cpp:174
  63. #10 0x000000000040af82 in TUserEngine::Process (this=0x1cad670, arg=<optimized out>, pconn=<optimized out>, CMD=<optimized out>,
  64.     CMDlen=<optimized out>) at gateway/src/TUserEngine.cpp:42
  65. #11 0x0000000000415fe6 in TServer::ThreadProcessD (this=<optimized out>, pcon=0x1cb0370, CMD=<optimized out>, CMDlen=43,
  66.     arg=0x1ca1c90) at gateway/src/TServer.cpp:123
  67. #12 0x0000000000416279 in TServer::ThreadProcess (this=<optimized out>, arg=<optimized out>) at gateway/src/TServer.cpp:186
  68. #13 0x0000000000414520 in MultiServer::WorkerLibevent (arg=<optimized out>) at gateway/src/MultiServer.cpp:361
  69. #14 0x00007f82e3a81df5 in start_thread (arg=0x7f82e05e7700) at pthread_create.c:308
  70. #15 0x00007f82e26e21ad in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
  71. (gdb) thread 4
  72. [Switching to thread 4 (Thread 0x7f82e0de8700 (LWP 24199))]
  73. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  74. 135        2:        movl        %edx, %eax
  75. (gdb) bt
  76. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  77. #1  0x00007f82e3a83d32 in _L_lock_791 () from /lib64/libpthread.so.0
  78. #2  0x00007f82e3a83c38 in __GI___pthread_mutex_lock (mutex=0x1cb04f8) at pthread_mutex_lock.c:64
  79. #3  0x0000000000406869 in TEngine::Base_Client_Lock (this=0x1caa750, send_conn=0x1cb0370, command=0x7f82e0de7bf0 "\031\260!",
  80.     size=52, is_zip=1) at gateway/src/TEngine.cpp:113
  81. #4  0x000000000040766c in TUserEngine::send_map_xy_client (this=<optimized out>, pcon=<optimized out>, Build_conn=<optimized out>,
  82.     command=<optimized out>, cmdlen=<optimized out>, send_count=<optimized out>) at gateway/src/TUserEngine.cpp:794
  83. #5  0x00000000004131ec in operator() (__args#4=0x7f82e0de7bac, __args#3=52, __args#2=0x7f82e0de7bf0 "\031\260!", __args#1=0x1cb0370,
  84.     __args#0=<optimized out>, this=0x7f82e0de7bd0) at /usr/include/c++/4.8.2/tr1/functional:2146
  85. #6  BaseTEngine::CallConnList(std::tr1::function<int (Conn*, Conn*, char const*, int, void*)>, Conn*, char const*, int, void*) (
  86.     this=this@entry=0x1caa750, f=..., ActConn=ActConn@entry=0x1cb0370, command=command@entry=0x7f82e0de7bf0 "\031\260!",
  87.     cmdlen=cmdlen@entry=52, n=n@entry=0x7f82e0de7bac) at gateway/src/BaseTEngine.cpp:166
  88. #7  0x0000000000409380 in TUserEngine::_MoveXY (this=this@entry=0x1caa750, x=x@entry=336, y=y@entry=2251, parameter=1,
  89.     hero_user_id=-1) at gateway/src/TUserEngine.cpp:643
  90. #8  0x00000000004093f7 in TUserEngine::moveXY (this=this@entry=0x1caa750, command=command@entry=0x7f82c0007384 "P\001",
  91.     DataLen=DataLen@entry=16) at gateway/src/TUserEngine.cpp:592
  92. #9  0x000000000040aa76 in TUserEngine::ExecCmd (this=this@entry=0x1caa750, command=0x7f82c0007384 "P\001", DataLen=DataLen@entry=16)
  93.     at gateway/src/TUserEngine.cpp:174
  94. #10 0x000000000040af82 in TUserEngine::Process (this=0x1caa750, arg=<optimized out>, pconn=<optimized out>, CMD=<optimized out>,
  95.     CMDlen=<optimized out>) at gateway/src/TUserEngine.cpp:42
  96. #11 0x0000000000415fe6 in TServer::ThreadProcessD (this=<optimized out>, pcon=0x1cb0370, CMD=<optimized out>, CMDlen=43,
  97.     arg=0x1ca1c40) at gateway/src/TServer.cpp:123
  98. #12 0x0000000000416279 in TServer::ThreadProcess (this=<optimized out>, arg=<optimized out>) at gateway/src/TServer.cpp:186
  99. #13 0x0000000000414520 in MultiServer::WorkerLibevent (arg=<optimized out>) at gateway/src/MultiServer.cpp:361
  100. #14 0x00007f82e3a81df5 in start_thread (arg=0x7f82e0de8700) at pthread_create.c:308
  101. #15 0x00007f82e26e21ad in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
  102. (gdb) thread 5
  103. [Switching to thread 5 (Thread 0x7f82e15e9700 (LWP 24198))]
  104. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  105. 135        2:        movl        %edx, %eax
  106. (gdb) bt
  107. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  108. #1  0x00007f82e3a83d4d in _L_lock_840 () from /lib64/libpthread.so.0
  109. #2  0x00007f82e3a83c6a in __GI___pthread_mutex_lock (mutex=0x1ca4820) at pthread_mutex_lock.c:85
  110. #3  0x00007f82e3609852 in debug_lock_lock (mode=<optimized out>, lock_=0x1cb0750) at evthread.c:227
  111. #4  0x00007f82e35f85ac in evbuffer_add (buf=0x1ca4790, data_in=0x1cb1ac0, datlen=79) at buffer.c:1725
  112. #5  0x00000000004182d7 in AddToWriteBuffer (this=0x1cb0370, this=0x1cb0370, len=<optimized out>, buffer=<optimized out>)
  113.     at gateway/src/../inc/MultiServer.h:232
  114. #6  socket_send (conn=conn@entry=0x1cb0370, buffer=<optimized out>, size=<optimized out>) at gateway/src/function.cpp:91
  115. #7  0x00000000004068b3 in TEngine::Base_Client_Lock (this=0x1ca7830, send_conn=0x1cb0370, command=0x7f82e15e8bf0 "\031\260!",
  116.     size=<optimized out>, is_zip=1) at gateway/src/TEngine.cpp:128
  117. #8  0x000000000040766c in TUserEngine::send_map_xy_client (this=<optimized out>, pcon=<optimized out>, Build_conn=<optimized out>,
  118.     command=<optimized out>, cmdlen=<optimized out>, send_count=<optimized out>) at gateway/src/TUserEngine.cpp:794
  119. #9  0x00000000004131ec in operator() (__args#4=0x7f82e15e8bac, __args#3=52, __args#2=0x7f82e15e8bf0 "\031\260!", __args#1=0x1cb0370,
  120.     __args#0=<optimized out>, this=0x7f82e15e8bd0) at /usr/include/c++/4.8.2/tr1/functional:2146
  121. #10 BaseTEngine::CallConnList(std::tr1::function<int (Conn*, Conn*, char const*, int, void*)>, Conn*, char const*, int, void*) (
  122.     this=this@entry=0x1ca7830, f=..., ActConn=ActConn@entry=0x1cb0370, command=command@entry=0x7f82e15e8bf0 "\031\260!",
  123.     cmdlen=cmdlen@entry=52, n=n@entry=0x7f82e15e8bac) at gateway/src/BaseTEngine.cpp:166
  124. #11 0x0000000000409380 in TUserEngine::_MoveXY (this=this@entry=0x1ca7830, x=x@entry=266, y=y@entry=2315, parameter=1,
  125.     hero_user_id=-1) at gateway/src/TUserEngine.cpp:643
  126. #12 0x00000000004093f7 in TUserEngine::moveXY (this=this@entry=0x1ca7830, command=command@entry=0x7f82d8003594 "\n\001",
  127.     DataLen=DataLen@entry=16) at gateway/src/TUserEngine.cpp:592
  128. #13 0x000000000040aa76 in TUserEngine::ExecCmd (this=this@entry=0x1ca7830, command=0x7f82d8003594 "\n\001", DataLen=DataLen@entry=16)
  129.     at gateway/src/TUserEngine.cpp:174
  130. #14 0x000000000040af82 in TUserEngine::Process (this=0x1ca7830, arg=<optimized out>, pconn=<optimized out>, CMD=<optimized out>,
  131.     CMDlen=<optimized out>) at gateway/src/TUserEngine.cpp:42
  132. #15 0x0000000000415fe6 in TServer::ThreadProcessD (this=<optimized out>, pcon=0x1cb0370, CMD=<optimized out>, CMDlen=43,
  133.     arg=0x1ca1bf0) at gateway/src/TServer.cpp:123
  134. #16 0x0000000000416279 in TServer::ThreadProcess (this=<optimized out>, arg=<optimized out>) at gateway/src/TServer.cpp:186
  135. #17 0x0000000000414520 in MultiServer::WorkerLibevent (arg=<optimized out>) at gateway/src/MultiServer.cpp:361
  136. #18 0x00007f82e3a81df5 in start_thread (arg=0x7f82e15e9700) at pthread_create.c:308
  137. ---Type <return> to continue, or q <return> to quit---
  138. #19 0x00007f82e26e21ad in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
  139. (gdb) thread 6
  140. [Switching to thread 6 (Thread 0x7f82e1dea700 (LWP 24197))]
  141. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  142. 135        2:        movl        %edx, %eax
  143. (gdb) bt
  144. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  145. #1  0x00007f82e3a83d32 in _L_lock_791 () from /lib64/libpthread.so.0
  146. #2  0x00007f82e3a83c38 in __GI___pthread_mutex_lock (mutex=0x1cb04f8) at pthread_mutex_lock.c:64
  147. #3  0x0000000000406869 in TEngine::Base_Client_Lock (this=0x1ca4910, send_conn=0x1cb0370, command=0x7f82e1de9bf0 "\031\260!",
  148.     size=52, is_zip=1) at gateway/src/TEngine.cpp:113
  149. #4  0x000000000040766c in TUserEngine::send_map_xy_client (this=<optimized out>, pcon=<optimized out>, Build_conn=<optimized out>,
  150.     command=<optimized out>, cmdlen=<optimized out>, send_count=<optimized out>) at gateway/src/TUserEngine.cpp:794
  151. #5  0x00000000004131ec in operator() (__args#4=0x7f82e1de9bac, __args#3=52, __args#2=0x7f82e1de9bf0 "\031\260!", __args#1=0x1cb0370,
  152.     __args#0=<optimized out>, this=0x7f82e1de9bd0) at /usr/include/c++/4.8.2/tr1/functional:2146
  153. #6  BaseTEngine::CallConnList(std::tr1::function<int (Conn*, Conn*, char const*, int, void*)>, Conn*, char const*, int, void*) (
  154.     this=this@entry=0x1ca4910, f=..., ActConn=ActConn@entry=0x1cb0370, command=command@entry=0x7f82e1de9bf0 "\031\260!",
  155.     cmdlen=cmdlen@entry=52, n=n@entry=0x7f82e1de9bac) at gateway/src/BaseTEngine.cpp:166
  156. #7  0x0000000000409380 in TUserEngine::_MoveXY (this=this@entry=0x1ca4910, x=x@entry=405, y=y@entry=2373, parameter=1,
  157.     hero_user_id=-1) at gateway/src/TUserEngine.cpp:643
  158. #8  0x00000000004093f7 in TUserEngine::moveXY (this=this@entry=0x1ca4910, command=command@entry=0x7f82d0005de4 "\225\001",
  159.     DataLen=DataLen@entry=16) at gateway/src/TUserEngine.cpp:592
  160. #9  0x000000000040aa76 in TUserEngine::ExecCmd (this=this@entry=0x1ca4910, command=0x7f82d0005de4 "\225\001",
  161.     DataLen=DataLen@entry=16) at gateway/src/TUserEngine.cpp:174
  162. #10 0x000000000040af82 in TUserEngine::Process (this=0x1ca4910, arg=<optimized out>, pconn=<optimized out>, CMD=<optimized out>,
  163.     CMDlen=<optimized out>) at gateway/src/TUserEngine.cpp:42
  164. #11 0x0000000000415fe6 in TServer::ThreadProcessD (this=<optimized out>, pcon=0x1cb0370, CMD=<optimized out>, CMDlen=43,
  165.     arg=0x1ca1ba0) at gateway/src/TServer.cpp:123
  166. #12 0x0000000000416279 in TServer::ThreadProcess (this=<optimized out>, arg=<optimized out>) at gateway/src/TServer.cpp:186
  167. #13 0x0000000000414520 in MultiServer::WorkerLibevent (arg=<optimized out>) at gateway/src/MultiServer.cpp:361
  168. #14 0x00007f82e3a81df5 in start_thread (arg=0x7f82e1dea700) at pthread_create.c:308
  169. #15 0x00007f82e26e21ad in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
  170. (gdb) thread 7
  171. [Switching to thread 7 (Thread 0x7f82e25eb700 (LWP 24196))]
  172. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  173. 135        2:        movl        %edx, %eax
  174. (gdb) bt
  175. #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
  176. #1  0x00007f82e3a83d32 in _L_lock_791 () from /lib64/libpthread.so.0
  177. #2  0x00007f82e3a83c38 in __GI___pthread_mutex_lock (mutex=0x1cb04f8) at pthread_mutex_lock.c:64
  178. #3  0x00000000004158a1 in TServer::AutoCloseEvent (this=<optimized out>, conn=0x1cb0370) at gateway/src/TServer.cpp:525
  179. #4  0x0000000000416693 in TServer::TimeOutCb (this=this@entry=0x1c53880) at gateway/src/TServer.cpp:500
  180. #5  0x00000000004167a2 in TServer::TimerCb (this=0x1c53880, arg=0x1cae4f0) at gateway/src/TServer.cpp:443
  181. #6  0x00000000004144e1 in MultiServer::WorkerTimerEvent (arg=<optimized out>) at gateway/src/MultiServer.cpp:342
  182. #7  0x00007f82e3a81df5 in start_thread (arg=0x7f82e25eb700) at pthread_create.c:308
  183. #8  0x00007f82e26e21ad in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
復(fù)制代碼
代碼大致是

  1. int TEngine::Base_Client_Lock(Conn *send_conn,const char* command,int size, int is_zip)
  2. {
  3.         if(send_conn==NULL)return -1;
  4.         pthread_mutex_lock(&send_conn->UserCMDLock);
  5.         if(send_conn==NULL)
  6.                 return -1;

  7.         if(send_conn->is_down==1){
  8.                 pthread_mutex_unlock(&send_conn->UserCMDLock);
  9.                 return -1;
  10.         }

  11.         int mid=proto->MODLUE_ID<0?proto->MODLUE_ID:9999999;
  12.         if (Client_BuildPact(mid,m_sbuff, command,size, is_zip) == -1)
  13.         {
  14.                 pthread_mutex_unlock(&send_conn->UserCMDLock);
  15.                 return -1;
  16.         }
  17.         socket_send(send_conn, m_sbuff->buff,m_sbuff->data_size);
  18.         pthread_mutex_unlock(&send_conn->UserCMDLock);
  19.         return 0;
  20. }

  21. int socket_send(Conn *conn,const  char *buffer, int size)
  22. {
  23. //        pthread_t pid = pthread_self();
  24. //        printf("%p|%ld,添加到發(fā)送緩沖區(qū)1\n", conn, pid);
  25.         //pthread_mutex_lock(&conn->GetThread()->send_mutex);   //ok
  26.         //pthread_mutex_lock(&conn->send_mutex);
  27.         //printf("%p|%ld,添加到發(fā)送緩沖區(qū)2\n", conn, pid);
  28.         if (conn != NULL)
  29.                 conn->AddToWriteBuffer((void *)buffer, size);

  30. //        printf("%p|%ld,添加成功并返回1\n", conn, pid);
  31.         //pthread_mutex_unlock(&conn->send_mutex);
  32.         //pthread_mutex_unlock(&conn->GetThread()->send_mutex);
  33.         //printf("%p|%ld,添加成功并返回2\n", conn, pid);
  34.        
  35.         return 0;
  36. }

  37. int AddToWriteBuffer(const void *buffer, int len)
  38.     {
  39. //                m_WriteBuf = bufferevent_get_output(m_bev);
  40.                 //printf("m_WriteBuf[%p]\n", m_WriteBuf);
  41.             if(fd_type>0 && m_WriteBuf!=NULL) {
  42.                         int res = evbuffer_add(m_WriteBuf, buffer, len);
  43. //                        int res = bufferevent_write(m_bev, buffer, len);//這個和上面evbuffer_add是一樣的
  44.                         return res;

  45.                 }
  46.                 else
  47.                         return -1;
  48.     }

復(fù)制代碼
用的是libevent框架,evbuffer_add里面libevent本身有個鎖,他鎖住不放,會導(dǎo)致上一層的pthread_mutex_unlock(&send_conn->UserCMDLock);不會釋放,導(dǎo)致其他線程卡在pthread_mutex_lock(&send_conn->UserCMDLock);鎖這里,但問題是,從日志中無法確定evbuffer_add里面的鎖為什么不釋放,因?yàn)樗粫䦟?dǎo)致交叉鎖呀,鎖都在這個函數(shù)里封裝好的,而外面想調(diào)用evbuffer_add,必須經(jīng)過pthread_mutex_lock(&send_conn->UserCMDLock);鎖,怎么破?????

論壇徽章:
4
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-08-11 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-08-15 06:20:00
2 [報(bào)告]
發(fā)表于 2016-01-10 09:14 |只看該作者
有個地方在函數(shù)返回前沒有unlock。

貼出一下:
        pthread_mutex_lock(&send_conn->UserCMDLock);
        if(send_conn==NULL)
                return -1;

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
3 [報(bào)告]
發(fā)表于 2016-01-11 09:57 |只看該作者
happy_fish100 發(fā)表于 2016-01-10 09:14
有個地方在函數(shù)返回前沒有unlock。

貼出一下:
這個沒錯的,send_conn==NULL的時候是無法解鎖的,而且這把鎖也已經(jīng)消失了。

論壇徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16賽季CBA聯(lián)賽之江蘇
日期:2017-11-27 11:42:3515-16賽季CBA聯(lián)賽之八一
日期:2017-04-12 14:26:2815-16賽季CBA聯(lián)賽之吉林
日期:2016-08-20 10:43:1215-16賽季CBA聯(lián)賽之廣夏
日期:2016-06-23 09:53:58程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-11 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-09 06:20:0015-16賽季CBA聯(lián)賽之上海
日期:2015-12-25 16:40:3515-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-22 09:39:36程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-24 06:20:002015亞冠之德黑蘭石油
日期:2015-08-07 09:57:302015年辭舊歲徽章
日期:2015-03-03 16:54:15
4 [報(bào)告]
發(fā)表于 2016-01-11 10:51 |只看該作者
本帖最后由 lxyscls 于 2016-01-11 10:53 編輯

回復(fù) 3# jd808
  1. pthread_mutex_lock(&send_conn->UserCMDLock);
  2. if(send_conn==NULL)
  3.     return -1;
復(fù)制代碼
你這樣實(shí)現(xiàn),本身就是錯誤的,send_conn == NULL,lock就crash了。你需要的是判斷l(xiāng)ock的返回狀態(tài)。

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
5 [報(bào)告]
發(fā)表于 2016-01-11 11:07 |只看該作者
lxyscls 發(fā)表于 2016-01-11 10:51
回復(fù) 3# jd808 你這樣實(shí)現(xiàn),本身就是錯誤的,send_conn == NULL,lock就crash了。你需要的是判斷l(xiāng)ock的返回 ...

沒聽過可以判斷互斥鎖的狀態(tài)呀

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
6 [報(bào)告]
發(fā)表于 2016-01-11 11:10 |只看該作者
lxyscls 發(fā)表于 2016-01-11 10:51
回復(fù) 3# jd808 你這樣實(shí)現(xiàn),本身就是錯誤的,send_conn == NULL,lock就crash了。你需要的是判斷l(xiāng)ock的返回 ...
而且這也沒錯,a線程鎖住他,準(zhǔn)備將句柄刪除,b線程在鎖這里等待,a線程刪除完成后鎖不存在,pconn置為NULL,如果b線程沒報(bào)錯,順利鎖住,這個時候pcon可能等于NULL,所以這個時候需要判斷pcon是否等于NULL,如果等于NULL,說明句柄實(shí)體都沒了,就沒有繼續(xù)下去的必要,鎖也將不存在了,(鎖是建立在pcon里面的。)

論壇徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16賽季CBA聯(lián)賽之江蘇
日期:2017-11-27 11:42:3515-16賽季CBA聯(lián)賽之八一
日期:2017-04-12 14:26:2815-16賽季CBA聯(lián)賽之吉林
日期:2016-08-20 10:43:1215-16賽季CBA聯(lián)賽之廣夏
日期:2016-06-23 09:53:58程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-11 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-09 06:20:0015-16賽季CBA聯(lián)賽之上海
日期:2015-12-25 16:40:3515-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-22 09:39:36程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-24 06:20:002015亞冠之德黑蘭石油
日期:2015-08-07 09:57:302015年辭舊歲徽章
日期:2015-03-03 16:54:15
7 [報(bào)告]
發(fā)表于 2016-01-11 11:11 |只看該作者
回復(fù) 5# jd808


    那你需要man pthread_mutex_lock

論壇徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16賽季CBA聯(lián)賽之江蘇
日期:2017-11-27 11:42:3515-16賽季CBA聯(lián)賽之八一
日期:2017-04-12 14:26:2815-16賽季CBA聯(lián)賽之吉林
日期:2016-08-20 10:43:1215-16賽季CBA聯(lián)賽之廣夏
日期:2016-06-23 09:53:58程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-11 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-02-09 06:20:0015-16賽季CBA聯(lián)賽之上海
日期:2015-12-25 16:40:3515-16賽季CBA聯(lián)賽之廣夏
日期:2015-12-22 09:39:36程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-24 06:20:002015亞冠之德黑蘭石油
日期:2015-08-07 09:57:302015年辭舊歲徽章
日期:2015-03-03 16:54:15
8 [報(bào)告]
發(fā)表于 2016-01-11 11:13 |只看該作者
回復(fù) 6# jd808


    destroy掉了,你還能lock得住,才真是見鬼了
    要是沒有destroy,你只是free了外部的那個結(jié)構(gòu)體,豈不是就資源泄露了?

論壇徽章:
4
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-08-11 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-08-15 06:20:00
9 [報(bào)告]
發(fā)表于 2016-01-11 11:40 |只看該作者
本帖最后由 happy_fish100 于 2016-01-11 11:41 編輯

lock住之后判斷宿主指針是否為空,總感覺這樣的用法不科學(xué)。╨ock之前已經(jīng)判斷過了)

如果其他線程會釋放宿主指針,可以使用如下步驟:
1. lock,實(shí)現(xiàn)互斥
2. 告訴使用宿主指針的其他線程宿主即將釋放,可以在宿主結(jié)構(gòu)體中增加一個成員變量
3. unlock
4. 延遲釋放指針,延遲時間根據(jù)實(shí)際情況設(shè)置。

當(dāng)然也可以有其他實(shí)現(xiàn)方式,比如智能指針(引用計(jì)數(shù)為0才真正釋放空間)。
建議使用智能指針方式。

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
10 [報(bào)告]
發(fā)表于 2016-01-11 15:23 |只看該作者
lxyscls 發(fā)表于 2016-01-11 11:13
回復(fù) 6# jd808
他們同時在競爭鎖,結(jié)果刪除線程搶贏了,操作線程搶輸了,那么操作線程那個家伙肯定是在排隊(duì),當(dāng)刪除線程操作完成后,那個家伙的內(nèi)存肯定也不存在了,但不知道他在另外一個線程哪里排隊(duì)情況如何?如果鎖計(jì)數(shù)器是歸0,還是不可預(yù)知,但可以肯定的時候,輪到他的時候,不關(guān)如何,都能夠鎖成功。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP