gpt4 book ai didi

c++ - 指向共享对象的指针在拥有它的不同对象中是不同的

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:00 24 4
gpt4 key购买 nike

我在共享指向共享对象的指针时遇到问题。我在 A 类中有一个 C 类型的对象,它与 B 类型的对象共享一个指向它的指针。然后该对象有一个线程正在更改对象 c 的值 val 但更改不会应用于存储在对象 b 中的指针>。任何人都可以帮助我为什么会这样?

使用BOOST:

#include <iostream>
#include <boost/thread.hpp>

class C {
public:
C(int _val): val(_val) {

}

~C(){

}

void live(){
while (true){
val = rand() % 1000;
std::cout << "val = " << val << std::endl;
}
}

void setVal(int a){

val = a;
}

int getVal(){
return val;
}

private:
int val;
};

class B {
public:
B(C* _pointer){
pointer = _pointer;
}

void live(){
while (true);
}

~B(){

}

C* pointer;
};

class A {
public:
A(): c(10), b(&c) {

}

void init() {
t0 = boost::thread(boost::bind(&B::live, b));
t1 = boost::thread(boost::bind(&C::live, c));
}

~A() {

}

boost::thread t0, t1;

B b;
C c;
};

void main() {
A a;
a.init();

while (true){
std::cout << a.b.pointer->getVal() << std::endl;
}
}

使用 C++ 11:

#include <iostream>
#include <thread>

class C {
public:
C(int _val): val(_val) {

}

~C(){

}

void live(){
while (true){
val = rand() % 1000;
std::cout << "val = " << val << std::endl;
}
}

void setVal(int a){

val = a;
}

int getVal(){
return val;
}

private:
int val;
};

class B {
public:
B(C* _pointer){
pointer = _pointer;
}

void live(){
while (true);
}

~B(){

}

C* pointer;
};

class A {
public:
A(): c(10), b(&c) {

}

void init() {
t0 = std::thread(std::bind(&B::live, b));
t1 = std::thread(std::bind(&C::live, c));
}

~A() {

}

std::thread t0, t1;

B b;
C c;
};

void main() {
A a;
a.init();

while (true){
std::cout << a.b.pointer->getVal() << std::endl;
}
}

最佳答案

我更改了这段代码:

t0 = boost::thread(boost::bind(&B::live, b));
t1 = boost::thread(boost::bind(&C::live, c));

到:

t0 = boost::thread(std::bind(&B::live, &b));
t1 = boost::thread(std::bind(&C::live, &c));

如果您不使用指向对象的指针,它可能会制作该对象的拷贝,然后运行线程。

关于c++ - 指向共享对象的指针在拥有它的不同对象中是不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com