1

メッセージをログに記録する関数を作成しています。この印刷機能を別のスレッドから呼び出します。私のコードは次のとおりです。

MyLog::printLog(const char* s)
    {

            std::string myline(s);
            //m_Mutex is class member and there will be only object for this class
            // shared by all threads
            int ret = pthread_mutex_lock(&m_Mutex);
            if ( ret != 0 )
            {
                    std::cout<<" trying to lock same mutex char* "<<std::endl;

            }


            //code to log message in File

            pthread_mutex_unlock(&m_Mutex);
     }

私の質問は、上記の関数が "from thread1" 、 "from thread 2" などの引数を使用して異なるスレッドから呼び出された場合、... const char * が間違った値を印刷する可能性がありますか? 私の質問が明確であることを願っています。

4

3 に答える 3

3

はローカル変数であるため、関数は期待どおりに機能しmylineます(各スレッドには独自のスタックがあるため、独自のインスタンスがありますmyline

于 2012-05-12T16:16:53.750 に答える
1

異なるスレッドからこの関数を呼び出していて、引数に加えた変更がconst char* sミューテックスによって保護されているm_Mutex場合は、問題はなく、何も混乱することはありません。

編集

実際、この関数を呼び出すたびに、別のスレッドから呼び出されたときに独自のスタックがconst char*あり、引数を変更できないため、ミューテックスで保護する必要はありません。

変数sは、呼び出されているスレッドに対してローカルな変数であり、ですconst

次に、ローカル変数にコピーしてmylineも、間違いなく何も混乱することはありません。各スレッドに呼び出しスタックがありmyline、この関数が呼び出されたときのインスタンスが存在します。これは、他のスレッドから完全に分離され、独立しています。

于 2012-05-12T16:16:45.807 に答える
1

関数の呼び出し方法によって異なりprintLogます。関数に渡すアドレスの文字列が別のスレッドによって変更された場合、ログ関数内で一貫したビューが表示されない場合があります。ただし、リテラルなどの不変文字列へのポインターを渡す場合は問題ありません。

これは良い例です:

void from_thread_one()
{
    MyLog::printLog("Hello World");  // immutable string
}

void from_thread_two()
{
    MyLog::printLog("Another text");  // ditto
}

一方、OK ではなく、競合がある例を次に示します。

char globalString[] = "This is a really long string";

void from_thread_one()
{
    globalString[5] = 'A';
    MyLog::printLog(globalString);
}

void from_thread_two()
{
    globalString[8] = 'Q';
    MyLog::printLog(globalString);
}

この設定では、( 経由でstd::string myline(s);) 文字列のコピーを作成していますが、 が指す配列の内容はs、他のスレッドで同時に変更できます。このシナリオでは、char ポインターの逆参照もクリティカル セクション内で発生する必要があります。

セットアップの根本的な問題は、生の char ポインターには、許容できる動作と許容できない動作をユーザーに伝える暗黙のセマンティクスがないことです。実際のstd::string値を渡した場合、関数から文字列へのアクセスを同期することに関する不確実性を取り除き、printLog責任を完全に呼び出し元に移したでしょう。

于 2012-05-12T17:52:01.467 に答える