多个线程同时调用同一个类的同一个对象的不同方法

时间:2022-09-28 11:18:37
这样会不会出问题?
前提是大家操作的都是不同的数据成员,不操作。比如
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


引用 1 楼 dustpg 的回复:
“程序会不会跪”,就算操作同一个,程序也不会跪啊,最多就是数据储存出错。
对于简单的数据储存,读取不同数据是没问题的。
.

对,而且这种bug很难找

#3


除了设计挫了点,有引发data race的可能外, 不会有任何问题。
对aaa只有读操作,i和j的地址不一样,同时读写的i和j没有问题

#4


引用 3 楼 yao_zhuang 的回复:
除了设计挫了点,有引发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


引用 4 楼 apophise 的回复:
Quote: 引用 3 楼 yao_zhuang 的回复:

除了设计挫了点,有引发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-- 不是原子操作。
有兴趣可以看看线程同步

#8


在调用有写操作的函数时要加锁,简单的读操作可以不加锁。。。

#9


既然提到了同一个对象,那么,真的不用考虑同步问题么?真的不同考虑么?真的不用么?不用么?不用?么?

#10


引用 9 楼 super_admi 的回复:
既然提到了同一个对象,那么,真的不用考虑同步问题么?真的不同考虑么?真的不用么?不用么?不用?么?

《十万个冷笑话》电影版?

#11


跟调用哪个方法没关系,跟调用方法所读写的数据有关系。

#1


“程序会不会跪”,就算操作同一个,程序也不会跪啊,最多就是数据储存出错。
对于简单的数据储存,读取不同数据是没问题的。
.

#2


引用 1 楼 dustpg 的回复:
“程序会不会跪”,就算操作同一个,程序也不会跪啊,最多就是数据储存出错。
对于简单的数据储存,读取不同数据是没问题的。
.

对,而且这种bug很难找

#3


除了设计挫了点,有引发data race的可能外, 不会有任何问题。
对aaa只有读操作,i和j的地址不一样,同时读写的i和j没有问题

#4


引用 3 楼 yao_zhuang 的回复:
除了设计挫了点,有引发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


引用 4 楼 apophise 的回复:
Quote: 引用 3 楼 yao_zhuang 的回复:

除了设计挫了点,有引发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-- 不是原子操作。
有兴趣可以看看线程同步

#8


在调用有写操作的函数时要加锁,简单的读操作可以不加锁。。。

#9


既然提到了同一个对象,那么,真的不用考虑同步问题么?真的不同考虑么?真的不用么?不用么?不用?么?

#10


引用 9 楼 super_admi 的回复:
既然提到了同一个对象,那么,真的不用考虑同步问题么?真的不同考虑么?真的不用么?不用么?不用?么?

《十万个冷笑话》电影版?

#11


跟调用哪个方法没关系,跟调用方法所读写的数据有关系。