SDL 带变量的多线程处理 -- 无法按预期工作
SDL Multithreading with variables -- Doesn't work as expected
我在一个名为 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 方法。
这是因为它显然不会在该线程中更改,您有责任告诉编译器它是否可以在不同的线程中更改,而您没有这样做。
您在两个线程中使用标准容器,因此您需要使用互斥锁保护每个访问。这将创建一个内存围栏(它解决了您所看到的问题),并在您同时从不同线程对容器执行操作时防止内部损坏(您的答案不会尝试解决)。
相关文章:
- 将双精度值转换为 char 变量时字符串流如何工作
- 私有变量无法正常工作的C++getter方法(只有Java经验)
- C++工作不统一,所有变量都定义
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 变量地址的运算符[]是如何工作的
- 可视化的c++变量赋值使代码正常工作
- 在 lambda 中通过引用捕获thread_local变量无法按预期工作
- 返回对局部变量的引用是否正常工作?
- 访问其他线程堆栈变量如何在C++中工作?
- 为什么分配给gr_complex变量(GNU Radio)不再为我工作?
- 如果 (QString.contains()) 不能正常工作,请使用 temp bool 变量进行更正
- 为什么在CTOR工作中将温度变量传递到const Ref中
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- 使用 swig 在 Python 中分段错误(核心转储),但当我更改变量名称时它可以工作
- 我对变量在递归函数中如何工作的理解是否正确?
- 为什么用未申报的变量工作调用函子
- 全局变量增量在 C++ 中的工作原理
- 使用未来wait_for时无法检查成员变量,但是如果我睡在线程中,它可以工作
- 带有双精度的变量无法正常工作
- 如何以相同的方法在子类中超载的相同方法来实现工作变量参数方法