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