0

「printf」は標準cであり、決定論的であるべきであることは知っています。しかし、Qt で実行すると、より非決定論的な応答 (クロック サイクル) が見られます。これは、Qt が応答に「ポーク」を追加したことが原因でしょうか?

ミューテックスを使用する関数を呼び出す複数のスレッドがあります。1 つのスレッドが入ると、他のスレッドが完了するまでスイッチを設定できません。数秒間問題なく動作しているように見えた後、スレッドが 10 から 1 スレッドに殺されているように見えました。そこで、遅延を追加してみました: (k=k+1: ヘルプなし)、(ループ k=k+1: ヘルプなし)、(usleep が動作)、(printf) はランダムな遅延の作成と許可で動作しますすべてのスレッドが実行を継続します。

void CCB::Write(int iThread)
{
    static bool bUse = false;
    bool bDone = false;
    char cStr[20];
    int posWrite;// = *m_posWrite;  // issue of posWrite be altered with next extrance
    long k = 0;
    long m = 0;
    m_threadCount++;

    while(bDone == false){

        if(bUse == false){
            bUse = true;
            posWrite = *m_posWrite;

            memcpy(m_cmMessageCB + posWrite, &m_cmMessageWrite, sizeof(typeCanMessage));

            memset(cStr, '\0', 20);
            memcpy(cStr, (m_cmMessageCB + posWrite)->cMessage, 11); //fails: every 20

            *m_posWrite = *m_posWrite + 1;
            if(*m_posWrite == m_iNBufferLength)
                *m_posWrite = 0;

            bDone = true;
            bUse = false;

        }else if(bUse == true){
            //why are threads being killed ?
    //            printf("T%d_%d ", iThread, m_threadCount);//non-deterministic value ?
            usleep(1);//non-deterministic value
            //k++;//delay of a couple clock cycles was not enough

            /*
            for(k = 0; k < iThread * 100; k++){//deterministic and fails to resolve thread problem
                m++;
            }
            */
        }
    }
}
4

0 に答える 0