前提是大家操作的都是不同的数据成员,不操作。比如
class A
{
public:
int i;
int j;
public:
A(){}
~A(){}
void addi(){ i ++}
void addj(){ j++}
}
主线程中
A* aaa = new A();
线程1不停的调度
aaa->addi();
线程2不停的调度
aaa->addj();
这样子跑,程序会不会跪?
11 个解决方案
#1
“程序会不会跪”,就算操作同一个,程序也不会跪啊,最多就是数据储存出错。
对于简单的数据储存,读取不同数据是没问题的。
.
对于简单的数据储存,读取不同数据是没问题的。
.
#2
对,而且这种bug很难找
#3
除了设计挫了点,有引发data race的可能外, 不会有任何问题。
对aaa只有读操作,i和j的地址不一样,同时读写的i和j没有问题
对aaa只有读操作,i和j的地址不一样,同时读写的i和j没有问题
#4
asio 中的 async_read 函数,回绑定一个回调函数,例如:
boost::asio::async_read(socket_, boost::asio::buffer(read_msg_.data(), chat_message::header_length), boost::bind(&chat_client::handle_read_header, this, boost::asio::placeholders::error));
这里绑定了回调handle_read_header
当这一次异步读完成之后,是谁(哪个线程)来执行这个回调函数呢?
#5
没有研究过,不过类似异步读写这一类的设计,回调都是发生在异步读写的调用线程的
#6
程序没问题,就算N个线程都操作addi都没事,只是看是不是你程序需要的,有时为了维护某个变量安全性,可以使用加锁技术,这样同一时刻只能一个线程访问加锁区域
#7
不会有事的,但是你如果是改成
void addi(){ i ++}
void addj(){ i--}
那么应有可能出现意想不到的结果,i++,i-- 不是原子操作。
有兴趣可以看看线程同步
void addi(){ i ++}
void addj(){ i--}
那么应有可能出现意想不到的结果,i++,i-- 不是原子操作。
有兴趣可以看看线程同步
#8
在调用有写操作的函数时要加锁,简单的读操作可以不加锁。。。
#9
既然提到了同一个对象,那么,真的不用考虑同步问题么?真的不同考虑么?真的不用么?不用么?不用?么?
#10
既然提到了同一个对象,那么,真的不用考虑同步问题么?真的不同考虑么?真的不用么?不用么?不用?么?
《十万个冷笑话》电影版?
#11
跟调用哪个方法没关系,跟调用方法所读写的数据有关系。
#1
“程序会不会跪”,就算操作同一个,程序也不会跪啊,最多就是数据储存出错。
对于简单的数据储存,读取不同数据是没问题的。
.
对于简单的数据储存,读取不同数据是没问题的。
.
#2
“程序会不会跪”,就算操作同一个,程序也不会跪啊,最多就是数据储存出错。
对于简单的数据储存,读取不同数据是没问题的。
.
对,而且这种bug很难找
#3
除了设计挫了点,有引发data race的可能外, 不会有任何问题。
对aaa只有读操作,i和j的地址不一样,同时读写的i和j没有问题
对aaa只有读操作,i和j的地址不一样,同时读写的i和j没有问题
#4
除了设计挫了点,有引发data race的可能外, 不会有任何问题。
对aaa只有读操作,i和j的地址不一样,同时读写的i和j没有问题
asio 中的 async_read 函数,回绑定一个回调函数,例如:
boost::asio::async_read(socket_, boost::asio::buffer(read_msg_.data(), chat_message::header_length), boost::bind(&chat_client::handle_read_header, this, boost::asio::placeholders::error));
这里绑定了回调handle_read_header
当这一次异步读完成之后,是谁(哪个线程)来执行这个回调函数呢?
#5
除了设计挫了点,有引发data race的可能外, 不会有任何问题。
对aaa只有读操作,i和j的地址不一样,同时读写的i和j没有问题
asio 中的 async_read 函数,回绑定一个回调函数,例如:
boost::asio::async_read(socket_, boost::asio::buffer(read_msg_.data(), chat_message::header_length), boost::bind(&chat_client::handle_read_header, this, boost::asio::placeholders::error));
这里绑定了回调handle_read_header
当这一次异步读完成之后,是谁(哪个线程)来执行这个回调函数呢?
没有研究过,不过类似异步读写这一类的设计,回调都是发生在异步读写的调用线程的
#6
程序没问题,就算N个线程都操作addi都没事,只是看是不是你程序需要的,有时为了维护某个变量安全性,可以使用加锁技术,这样同一时刻只能一个线程访问加锁区域
#7
不会有事的,但是你如果是改成
void addi(){ i ++}
void addj(){ i--}
那么应有可能出现意想不到的结果,i++,i-- 不是原子操作。
有兴趣可以看看线程同步
void addi(){ i ++}
void addj(){ i--}
那么应有可能出现意想不到的结果,i++,i-- 不是原子操作。
有兴趣可以看看线程同步
#8
在调用有写操作的函数时要加锁,简单的读操作可以不加锁。。。
#9
既然提到了同一个对象,那么,真的不用考虑同步问题么?真的不同考虑么?真的不用么?不用么?不用?么?
#10
既然提到了同一个对象,那么,真的不用考虑同步问题么?真的不同考虑么?真的不用么?不用么?不用?么?
《十万个冷笑话》电影版?
#11
跟调用哪个方法没关系,跟调用方法所读写的数据有关系。