带变量的SDL多线程-无法按预期工作

时间:2019-01-13 15:53:57

标签: c++ multithreading sdl-2

在名为 Main 的命名空间中,有一个静态整数和一个名为 other 的静态类变量,如下所示:

namespace Main {
    void test();

    static Client other;
    static int v = 0;
}

然后,在程序启动时,调用Main :: test(),并通过SDL创建线程:

void test() {
    SDL_CreateThread(Client::test, (const char*)"Client", (void*)NULL);

    v = 1;
    std::cout << v << std::endl;
    ...
}

这使客户端启动名为 test 的函数,该函数将永久打印矢量大小,如下所示:

int Client::test(void* data)
{
    while(1) {std::cout << Main::v << std::endl; }
}

现在,这是问题所在! Main 返回1,而 Client 返回很多零!那里发生什么了?该变量是静态变量,因此 Client 应该相同!

3 个答案:

答案 0 :(得分:3)

根据定义,

std::vector.size()是向量中元素的数量。

在任何情况下,如果您认为不是这种情况,或者看到这种情况的症状,则可能是由于内存损坏或越界访问导致的未定义行为。

请注意,分配给向量v[n] = x;的索引位置不会扩展向量,并且如果n >= v.size()则是未定义的行为。

答案 1 :(得分:2)

在没有显式同步的情况下,允许编译器通过假设v从不改变来优化Client :: test方法。

这是因为它显然在那个线程中没有改变,您有责任告诉编译器它是否可以在其他线程中改变,而您没有这样做。

答案 2 :(得分:0)

您在两个线程中使用标准容器,因此需要使用互斥量保护每次访问。这样会创建一个内存隔离栅(可以解决您所遇到的问题),并在您同时从不同线程对容器执行操作时避免内部损坏(您的答案没有尝试解决)。