C++ 在不同线程中访问对象
这里有两个班级:C++ 在不同线程中访问对象,c++,multithreading,C++,Multithreading,这里有两个班级: class TestClass { public: TestClass(); map<int,int> int_map; }; TestClass::TestClass() { printf("TestClass1 addr(%p) \n",this); } TestClass2::TestClass2(TestClass* tc){ tc1 = tc; printf("TestClass2 ge
class TestClass
{
public:
TestClass();
map<int,int> int_map;
};
TestClass::TestClass()
{
printf("TestClass1 addr(%p) \n",this);
}
TestClass2::TestClass2(TestClass* tc){
tc1 = tc;
printf("TestClass2 get TestClass1 ,addr(%p) !\n",tc1);
}
class TestClass2
{
public:
TestClass2(TestClass* tc);
void Run();
TestClass* tc1;
};
void TestClass2::Run(){
int i = 0;
while(true){
tc1->int_map.insert(make_pair(i,1));
printf("TestClass2:size of TestClass1(%p) int_map is %d!\n",tc1,tc1->int_map.size());
sleep(2);
i++;
}
}
TestClass中的int_映射在不同线程中打印时的大小应该相同
tc2->Run()打印出正确的值,
但是我在子线程中得到了0,尽管tc1在两个线程中指向相同的地址。您不使用线程,而是创建了一个新进程!但是当访问同一地址的对象时,结果可能会不同?“fork()通过复制调用进程来创建一个新进程。”和“子进程和父进程在不同的内存空间中运行。在fork()时,两个内存空间具有相同的内容。内存写入、文件映射(mmap(2))和取消映射(munmap(2))由其中一个进程执行,不会影响另一个进程。
int main()
{
TestClass* tc1 = new TestClass();
printf("tc1 addr is %p!\n",tc1);
TestClass2* tc2 = new TestClass2(tc1);
pid_t pid = fork();
if(pid == 0){
while(1){
sleep(1);
printf("TestClass1 :%p int_map size %d!\n",tc1,tc1->int_map.size());
}
}else{
tc2->Run();
}
}