gdbを使って合併プログラムのデッドロックを位置決めします.

3693 ワード

gdbを使って合併プログラムのデッドロックを位置決めします.
転載:http://blog.sina.com.cn/s/blog_48 d 4 cf 2 d 010 0 mx 5 o.
    複雑な同時進行にとって、デッドロックは頭を悩ます問題です.本論文では、プログラムが異常を発見した時に、gdbを通じてプログラムの動作状態を確認し、隠しエラーを発見し、位置決めする方法を提案しています.
      先にわざと書きますと、デッドロックになるコードです.
=======================コードの区切り==================================================================================================
#include <iostream>
#include <unistd.h>
#include <boost/thread.hpp>

using namespace std;

boost::mutex mtx;
boost::mutex mtx2;

void run()
{   
   boost::mutex::scoped_locklock(mtx);
    sleep(1);
    {
       boost::mutex::scoped_locklock(mtx2);   
        cout<< "get two locks"<< endl;
    }      
}

void run2()
{   
   boost::mutex::scoped_locklock(mtx2);
    sleep(1);
    {
       boost::mutex::scoped_locklock(mtx);   
        cout<< "get two locks"<< endl;
    }   
}

int main(int argc, char* argv[])
{
   boost::thread_group grp;
    grp.create_thread(run);
    grp.create_thread(run2);

    grp.join_all();
    return 0;
}
======================デモの区切り線==================================================================================================
      コンパイル:g+-g test.cpp-pthread-lrt/usr/librost_thread-gcc 41-mt.a
      実行://a.out
      プログラムは私達が予想していたように掛けられました.この時は別のウィンドウで実行します.
同前
ps a_grep a.out grep-v「grep」
32087 pts/0      R+        2:06./a.out
同前
gdb a.out 32087

(gdb)
infothreads
  3 Thread 0 x 4115 f 940(LWP 323219)  0 x 00000636 f 80 d 4 c 4 in_ull唵ロックwait()from/lib 64/libpthread.so.
  2 Thread 0 x 41 fc 5940(LWP 323220)  0 x 00000636 f 80 d 4 c 4 in_ull唵ロックwait()from/lib 64/libpthread.so.
*1 Thread 0 x 2 ba 80 b 594230(LWP 323218)  0 x 00000636 f 80 aee 9 inpthread_cond_wait@GLOIBC_2.3.2()from/lib 64/libpthread.so.
      現在のプロセスには三つのスレッドがあり、メインスレッドは何も言いません.joinにふさぐall今走って他のスレッドのスタック情報を見に行きます.
(gdb)
thread 2
[Switching to thread 2(Thread 0 x 41 fc 5940(LWP 323220))]_  0 x 00000636 f 80 d 4 c 4 in_ull唵ロックwait()from/lib 64/libpthread.so.
(gdb)
bt
同前  0 x 00000636 f 80 d 4 c 4 in_ull唵ロックwait()from/lib 64/libpthread.so.
湖南省にある地名.  0 x 00000636 f 808 e 1 a in_L_.ロック1034()from/lib 64/libpthread.so..0
湖南省にある地名.  0 x 00000636 f 808 cdc in pthread_mutexロック()from/lib 64/libpthread.so.0
ヽoo.ツ  0 x 000004037 b 3 inbook:muttex:lock(this=0 x 6107 a 0)at/usr/local/include/book/thread/pthread/muttex.hpp:50
ヽoo.ツ  0 x 0000040381 f inbook:unique_lock:lock(this=0 x 41 fc 50 a 0)at/usr/local/include/bootst/thread/locks.hpp:349
ヽoo.ツ  0 x 000004035 a inbook:unique_lock<bootst:mutex>:unique_lock(this=0 x 41 fc 50 a、m_=)at/usr/local/include/bootst/thread/locks.hpp:227
ヽoo.ツ  0 x 0000040225 b in run 2()atest.cpp:25
湖南省にある地名.  0 x 0000002 e 75 inbook:detail:::thread_data湖南省にある地名.  0 x 00000405 a 60 in thread_proxy
湖南省にある地名.  0 x 0000000 in?()
      注意してください  0 x 0000040225 b in run 2()atest.cpp:25」というスレッドが詰まっているところです.同じ方法で他のスレッドを調べてもいいです.原稿料があれば、ぜひもう一度見せてください.残念ですが、ありません.だからこのようにします.
=========================Bの境界線================================================================================================
      虫を捕まえるのはやむを得ない方便です.bugは防を主とする.上記の技術でデッドロックが発見されても、モジュールの呼び出しが不明瞭で、同時に混乱していると、虫が一匹また一匹を捕まえて、絞殺して一つだけを二つに導入して、結果はきりがないかもしれません.どうやって同時進行中にデッドロックを避けるべきですか?正しい言い方は同じ順番でロックを要求することです.しかし、問題はこんなに簡単ではない場合があります.同じ順序でロックを要求するのは主に能動的なオブジェクトのセットに適用されます.もっと複雑な状況はいつかもう一度よくまとめてみます.