在不同的线程中操作同一个类。

bdxxxx 2012-04-21 02:30:43
class A
{
public:
static void static_fun(void * p)
{
A * pThis = (A *)p;
p->m_nPrivate = 30;
};

private:
int m_nPrivate;
}


在线程2中调用static_fun,在线程1中析构类A,怎么才能确保staic_fun访问类A的变量不出错。
想了下,只想到了在~A和static_fun中都加锁。但是为了保证效率,希望在static_fun中做的事尽量少(虽然一个锁也算不得多复杂)。
求高手指点,希望能得到更多方法。
...全文
176 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2012-04-22
  • 打赏
  • 举报
回复
此类问题,建议用Singleton模式。

详情参考:
C++实现Singleton模式
bdxxxx 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

你这里描述的不清楚啊。如果你是想在线程1中析构,线程2只调用这个static函数,那一个标记变量就够了。while循环结束置标记为true,析构函数中循环读取这个变量值sleep一段时间来析构。
[/Quote]

就是不想用到sleep之类不确定的函数啊
cattycat 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 6 楼 的回复:

你这里描述的不清楚啊。如果你是想在线程1中析构,线程2只调用这个static函数,那一个标记变量就够了。while循环结束置标记为true,析构函数中循环读取这个变量值sleep一段时间来析构。


就是不想用到sleep之类不确定的函数啊
[/Quote]

是循环sleep,应该可以的。当然不是好的解决方法。
while(flat){
sleep(5);
}
这种。
happycomputer1 2012-04-22
  • 打赏
  • 举报
回复
1.楼主意思不太明白啊?一个线程析构A对象的同时?另外一个线程又访问A对象,简单点的,只能是加把锁,然后判断A对象指针是否为空?这要求每次析构时,要将A对象指针置为空
oniisama 2012-04-22
  • 打赏
  • 举报
回复
看你的意思,线程1不需要等待static_fun的结果,那就在堆上创建A的对象,然后用share_ptr包装传进static_fun。
cattycat 2012-04-21
  • 打赏
  • 举报
回复
你这里描述的不清楚啊。如果你是想在线程1中析构,线程2只调用这个static函数,那一个标记变量就够了。while循环结束置标记为true,析构函数中循环读取这个变量值sleep一段时间来析构。
cattycat 2012-04-21
  • 打赏
  • 举报
回复
你这里描述的不清楚啊。如果你是想在线程1中析构,线程2只调用这个static函数,那一个标记变量就够了。while循环结束置标记为true,析构函数中循环读取这个变量值sleep一段时间来析构。
cattycat 2012-04-21
  • 打赏
  • 举报
回复
你这里描述的不清楚啊。如果你是想在线程1中析构,线程2只调用这个static函数,那一个标记变量就够了。while循环结束置标记为true,析构函数中循环读取这个变量值sleep一段时间来析构。
bdxxxx 2012-04-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

你这是要干什么?
通过一个类来共享对象?
或者说共享对象里面的成员吗?


差不多这个意思,就是使用中发现很多时候都有不同的线程访问类,有些函数又比较耗时,稍有处理不当在不对的时候析构了程序就崩溃了。
虽然加锁能解决,但想求更优秀的方法。
[/Quote]

说错了,用锁还是有很大的问题。发帖之前都记到的,发个帖反而搞忘了,所以求可行方法。
bdxxxx 2012-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你这是要干什么?
通过一个类来共享对象?
或者说共享对象里面的成员吗?
[/Quote]

差不多这个意思,就是使用中发现很多时候都有不同的线程访问类,有些函数又比较耗时,稍有处理不当在不对的时候析构了程序就崩溃了。
虽然加锁能解决,但想求更优秀的方法。
evencoming 2012-04-21
  • 打赏
  • 举报
回复
你这是要干什么?
通过一个类来共享对象?
或者说共享对象里面的成员吗?

主要特性Java 语言是简单的:Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。Java 语言是面向对象的:Java 语言提供、接口和继承等面向对象的特性,为了简单起见,只支持之间的单继承,但支持接口之间的多继承,并支持与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。Java语言是分布式的:Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口有一个网络应用编程接口(java net),它提供了用于网络应用编程的库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。Java 语言是健壮的:Java 的强型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。Java语言是安全的:Java通常被用在网络环境,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的具有一个安全防范机制( ClassLoader),如分配不同的名字空间以防替代本地的同名、字节代码检查,并提供安全管理机制( SecurityManager)让 Java 应用设置安全哨兵。Java 语言是体系结构立的:Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统运行。这种途径适合于异构的网络环境和软件的分发。Java 语言是可移植的:这种可移植性来源于体系结构立性,另外,Java 还严格规定了各个基本数据型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。Java 语言是解释型的:如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统运行。在运行时,Java 平台的 Java 解释器对这些字节码进行解释执行,执行过程需要的在联接阶段被载入到运行环境。Java 是高性能的:与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。Java 语言是多线程的:在 Java 语言线程是一种特殊的对象,它必须由 Thread 或其子(孙)来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 派生出子并重写 run 方法,使用该子创建的对象即为线程。值得注意的是 Thread 已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。Java 语言是动态的:Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的能够动态地被载入到运行环境,也可以通过网络来载入所需要的。这也有利于软件的升级。另外,Java 有一个运行时刻的表示,能进行运行时刻的型检查。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧