我使用的是 Win7/VS2008 (9) SDK 6/7.1
我在使用的代码中遇到了问题
mini版代码如下
class CONNECTION
{
int/std::string/bool vars; // just to make it simple
CONNECTION ( int defaultvar );
CONNECTION ( const CONNECTION& copycon )
~CONNECTION ( );
DWORD static WINAPI staticstart( void *param ) //HACK to use createthread on classes
{ return ((CONNECTION *)param)->main); } // yea it works fine
DWORD main();
};
这个类没有带拷贝和析构函数的默认构造函数 所有 vars 都被很好地复制并且析构函数没有留下 memleaks,构造函数很简单,就像将参数分配给 var .. 所有 vars 和代码都被省略以使其简单,因为它们不是概率。
class main
{
std::vector<CONNECTION> con;
int addcon( int defaultvarofcon )
{
CONNECTION temp( defaultvar );
con.push_back( temp );
return con.size() - 1;
}
}
到目前为止还不错 当我运行一个只有包含和这段代码的控制台测试程序时
main mymainclass;
mymainclass.addcon( 0 );
程序运行良好,关闭时没有错误
但是当我添加像
main mymainclass;
mymainclass.addcon( 0 );
mymainclass.addcon( 1 );
mymainclass.addcon( 2 );
程序因访问冲突而崩溃 在检查我的代码两次后,我在所有线程上逐步调试它,我发现主线程可以读取主线程和工作线程中所有 vector 类/元素的正确值,只有当我在 vector 中使用一个元素时
但是,如果我像第二个代码一样使用多个元素,则它们自己线程上的所有元素上的所有数据都无法访问(坏指针)。但在主线程上它们仍然正确并显示正确的值
任何人都可以帮我弄清楚这段代码有什么问题吗?
最佳答案
std::vector
并非设计为线程安全的。因此,您必须使用某种互斥锁来确保一次只有一个线程访问它。
否则,如果任何线程调整 vector 的大小, vector 可能必须分配新的存储空间,复制元素,然后释放旧的存储空间……显然释放旧的存储空间而其他线程正在使用它是一件非常糟糕的事情.
您需要自己分配CONNECTION
对象。让 std::vector
管理它们意味着它们将在 vector 调整大小时在内存中四处移动,而其他线程持有的指针则悬空。调整 vector 的大小会使指向其任何内容的所有指针无效。
关于C++ vector/类/线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4575527/