在名为 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 应该相同!
答案 0 :(得分:3)
std::vector.size()
是向量中元素的数量。
在任何情况下,如果您认为不是这种情况,或者看到这种情况的症状,则可能是由于内存损坏或越界访问导致的未定义行为。
请注意,分配给向量v[n] = x;
的索引位置不会扩展向量,并且如果n >= v.size()
则是未定义的行为。
答案 1 :(得分:2)
在没有显式同步的情况下,允许编译器通过假设v从不改变来优化Client :: test方法。
这是因为它显然在那个线程中没有改变,您有责任告诉编译器它是否可以在其他线程中改变,而您没有这样做。
答案 2 :(得分:0)
您在两个线程中使用标准容器,因此需要使用互斥量保护每次访问。这样会创建一个内存隔离栅(可以解决您所遇到的问题),并在您同时从不同线程对容器执行操作时避免内部损坏(您的答案没有尝试解决)。