2016-07-08 10 views
0

私は現在、1秒間スリープしてからログファイルに書き込み、画面にプリントするpthreadを使用しています。私のint main()では、永遠に実行されるwhileループがありますが、最終的には停止します。ループでは、私のシングルトンクラスであるロガーにアクセスし、それに書き込んで、画面にも印刷します。ここでロガーがインスタンスfuncitonを取得します...シングルトンクラスにアクセスする2つのスレッド - 正しく動作しません。

Logger* Logger::getInstance(){ 
if(logger == NULL){ 
    logger = new Logger(); 
} 

return logger; 

}

ここで第二のを待つスレッド関数だ...

void Beacon::send(){ 
while(1){ 
    sleep(1); 
    Logger* logger = Logger::getInstance(); 
     logger->log("Sending"); 
} 
} 

ここでもロガーに印刷whileループです。 checkQueueのfuncitonは、私はそれがwhileループでログイン持っている場合、それが唯一の画面にチェックを印刷します

...今

while(!a){ 

     logger->getInstance()->log("Checking..."); 
     checkQueue(); 



     if(a == true) 
      break; 

} 
を何もしません。私がそれをコメントアウトすると、画面に送信されます。 getインスタンス関数で二重ロックチェックを行う必要がありますか?私はそれを調べようとしてきましたが、実装方法を理解していません。

+2

私は任意のスレッドを見ることができませんまたはそこにコードをロックします。また、私はいわゆる "メイヤー"シングルトンパターンをお勧めします:https://stackoverflow.com/questions/1008019/c-singleton-design-pattern – Galik

+0

これはC++ 11かC++ 03ですか? –

+0

メインループの内部に短いスリープを入れた場合、「ビーコンの送信」が表示されますか?あなたはあなたのロックコードを表示していませんが、メインのループがあまりにもタイトで、ロックをあまりにも頻繁に持っていると、 'Beacon'がロックを取ることができないことがあります。 –

答えて

2

C++ 11でシングルトンを作成する最も簡単な方法はこれです:ローカル静的変数の初期化がでスレッドセーフです

MyClass& MyClass::getInstance() { 
    static MyClass instance; 
    return instance; 
} 

C++ 11

+0

私もこれを一点で行いましたが、それでも引き続きチェックをプリントアウトし、送信はしませんでした。 – ThatBoiJo

+0

これは 'Logger'クラス内のレースになります。ミューテックスまたは条件変数を使用して、それを防ぐことができます。ロガーの内部バッファもフラッシュするようにしてください。 –

関連する問題