私は現在、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インスタンス関数で二重ロックチェックを行う必要がありますか?私はそれを調べようとしてきましたが、実装方法を理解していません。
私は任意のスレッドを見ることができませんまたはそこにコードをロックします。また、私はいわゆる "メイヤー"シングルトンパターンをお勧めします:https://stackoverflow.com/questions/1008019/c-singleton-design-pattern – Galik
これはC++ 11かC++ 03ですか? –
メインループの内部に短いスリープを入れた場合、「ビーコンの送信」が表示されますか?あなたはあなたのロックコードを表示していませんが、メインのループがあまりにもタイトで、ロックをあまりにも頻繁に持っていると、 'Beacon'がロックを取ることができないことがあります。 –