1

同時読み取りと書き込みをシミュレートしようとしています。何らかの理由で、スレッドは同時にこれを行いません。2 つのスレッドを作成します。これらのスレッドには Sleep(0) が含まれているため、他のスレッドが処理を実行できます。新しいオブジェクトを作成する部分では、スリープ状態にします。

delete this->item; this->item = 0; Sleep(0); this->item = new hallo();

このテストをリリース モードで約 2 時間実行しました。例外やクラッシュはありませんでした。私は何を間違っていますか?

これは私がこれをやろうとする方法です:

#include <Windows.h>
#include <stdio.h>

#include "Source.h"

DWORD WINAPI readVar(LPVOID);
DWORD WINAPI writeVar(LPVOID);

testclass * testobject;

int main()
{
    testobject = new testclass();

    CreateThread(NULL,NULL,readVar,NULL,NULL,NULL);
    CreateThread(NULL,NULL,writeVar,NULL,NULL,NULL);

    while(true)
        Sleep(10000);
}

DWORD WINAPI readVar(LPVOID)
{
    while(true)
    {
        hallo * testObjectTest = testobject->getValue();
        if(!testObjectTest->outpoutSomeData())
            printf("ERROR\n\n");

        Sleep(0);
    }

    return NULL;
}

DWORD WINAPI writeVar(LPVOID)
{
    while(true)
    {
        testobject->resetValue();
        Sleep(0);
    }

    return NULL;
}

これらはクラスです:

class hallo
{
public:
    hallo() {printf("Object created\n");}
    ~hallo() {printf("Object removed\n");}
    bool outpoutSomeData() { printf("Call\n"); return true; }
};

class testclass
{
private:
    hallo * item;
public:
    testclass() {this->item = new hallo(); }
    hallo * getValue() { return item; }
    void resetValue() { delete this->item; this->item = 0; Sleep(0); this->item = new hallo(); }
};

ご参考までに:

  • これは簡単なテストです。私は「良いコーディング」にはあまり注意を払いませんでした。
  • 私は4つのCPUコアを持っているので、それが可能である必要があります.
  • 他のプログラムでこの問題が何度も発生しましたが、ロックで修正しました。ここで、これが発生するテストを作成したいと思います。しかし、それはうまくいきません。
4

0 に答える 0