5

複数のスレッドから、次の追加関数が呼び出されます。カウンターがまだインクリメントされていないため、データに追加を再書き込みさせたくありません。

これにより、現在追加を使用しているスレッドを除いて、入ってくるすべてのスレッドが中断されますか? それとも、他のスレッドは実行を継続し、データを追加しませんか?

ミューテックスは「静的」である必要がありますか、それとも各インスタンスは操作を中断することを知っていますか?

問題が発生したくない場合は、ログ データをバックアップするためのバッファーを構築する必要があると思いますか?

void classA::Append(int _msg)
{
    static int c = 0;
    QMutex mutex; //need to be static so other threads know to suspend?
                  //there are 10 threads creating an instantiation of classA or an object of classA     

    mutex.lock();

    intArray[c] = _msg;
    c++;

    mutex.unlock();
}
4

5 に答える 5

4

いいえ、必要はありませんstatic。あなたのメンバーにするだけで、QMutexLockerclassAを見てミューテックスのスコープロックとロック解除を行うことができます:

void classA::Append(int _msg)
{
    static int c = 0;
    QMutexLocker locker(&mutex); // mutex is a QMutex member in your class

    intArray[c] = _msg;
    c++;

    /*mutex.unlock(); this unlock is not needed anymore, because QMutexLocker unlocks the mutex when the locker scope ends, this very useful especially if you have conditional and return statements in your function*/
}
于 2013-07-24T15:40:42.453 に答える
1

QMutex を静的として宣言する必要はありません。Qt は、別のスレッドがその関数で実行を継続できるようにする前に、ミューテックスでロック解除が発生するまで他のスレッドが待機することを保証します。

于 2013-07-24T15:41:52.087 に答える
0

私の問題を解決するために、複数回実行した後、classA の複数のインスタンス化のためにミューテックスを「静的」にする必要がありました。ミューテックスをメンバーにすることは機能しませんでした。

void classA::Append(int _msg)
{
    static int c = 0;
    static QMutex mutex; //YES... need to be static so other threads know to suspend
                         //there are 10 threads creating an instantiation of classA or an object of classA     

    mutex.lock();

    intArray[c] = _msg;
    c++;

    mutex.unlock();
}
于 2013-07-24T17:56:03.340 に答える
0

@jdl「ミューテックスをメンバーにすることは機能しませんでした」。はい、動作します。次のようにミューテックスを「静的」にしてみてください。

//classA.h
class ClassA {
    public:
        static QMutex mutex;
        // rest of variables and Methods
        // ...
}


//classA.cpp
QMutex ClassA::mutex; // Before all
ClassA::ClassA() {
    //Constructor
}
void ClassA::Append(int _msg) {
    static int c = 0
    QMutexLocker locker(&mutex)
    intArray[c] = _msg;
    c++;
}
于 2015-08-21T14:25:53.703 に答える
-4

QMutex が実際にどのように動作しているのかわからないので、独自のミューテックスを作成しました。

void classA::Append(int _msg)
{
    static int c = 0;
    static int mutex = 0; //YES... need to be static so other threads know to suspend
                     //there are 10 threads creating an instantiation of classA or an object of classA     

    while(mutex == 1){
        //suspend thread
    }

    if(mutex == 0){
        mutex = 1;//lock        

        intArray[c] = _msg;
        c++;

        mutex = 0;//unlock
    }

}
于 2013-07-24T18:11:21.927 に答える