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

SDL Multithreading with variables -- Doesn't work as expected

本文关键字:工作 变量 多线程处理 SDL      更新时间:2023-10-16

我在一个名为 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; }
}

现在,问题来了!返回 1,客户端返回很多零!那里发生了什么?变量是静态的,所以客户端应该是一样的!

根据定义,std::vector.size()是向量中元素的数量。

如果您认为情况并非如此,或者您看到情况并非如此的症状,则您可能由于内存损坏或越界访问而遇到未定义的行为。

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

如果没有显式同步,编译器可以通过假设 v 永远不会更改来优化 Client::test 方法。

这是因为它显然不会在该线程中更改,您有责任告诉编译器它是否可以在不同的线程中更改,而您没有这样做。

您在两个线程中使用标准容器,因此您需要使用互斥锁保护每个访问。这将创建一个内存围栏(它解决了您所看到的问题),并在您同时从不同线程对容器执行操作时防止内部损坏(您的答案不会尝试解决)。