C++线程安全类的设计

jlangtao 2011-08-14 12:57:51

/// <summary>
/// 示例
/// </summary>
class ClassA
{
private:
/// <summary>
/// 可能同步访问的成员
/// </summary>
int m_var;
public:
/// <summary>
/// 取得私有成员值
/// </summary>
int Get() const
{
return this->m_var;
}
/// <summary>
/// 设置私有成员值
/// </summary>
void Set(int var)
{
this->m_var = var;
}
};
/*
是这样的, 当有多个线程同时访问 ClassA.Get() 的时候, 当然是没有问题的.
可是当其中有一个或多个线程同步执行 ClassA.Set(int) 方法时就可能出现无法预知的后果.
那么, 我该如何设计, 一旦某个线程进入了 ClassA.Set(int) 方法后, 其它线程无论是调用
ClassA.Get() 还是 ClassA.Set(int) 都将阻塞? 而且还要考虑被阻塞线程继续执行的先后顺序.
有点就是, 仅限于类的设计, 无法更改或调整线程的执行代码.
希望有经验的可以给些指点, 有规范是方法更好, 谢谢!
*/
...全文
464 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jlangtao 2011-08-15
  • 打赏
  • 举报
回复
没有使用第三方库
heyatao 2011-08-14
  • 打赏
  • 举报
回复
你使用的TThread类还是其他第三方的线程库呢?
zzbinfo 2011-08-14
  • 打赏
  • 举报
回复
我觉得你这个问题如果是没有办法修改线程执行代码的话,是保证不了线程安全的。类要设计成线程安全最有效的就是设计加锁象TThreadList一样提供个LockList();和UnlockList();,但是为了保证使用的线程安全性,在使用的时候要调用这两个方法。如果使用这个类的时候根本就不调用这两个方法还是不能保证线程安全的。不知道我理解的你的需求对不对。
jlangtao 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lsq19871207 的回复:]
引用 5 楼 jlangtao 的回复:
引用 1 楼 ouyh12345 的回复:
加锁


对, 但是比如加锁后, 一个线程正在写入, 有N个线程在等待, 那么解锁时要怎样保证接下来的线程执行顺序的?


或者用信号量、事件

至于保证线程执行顺序,是否可以考虑线程优先级???

全部创建CREATE_SUSPENDED(挂起)的线程
然后再SetThreadPri……
[/Quote]

线程数量是未知的,所以不行。
信阳毛尖 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jlangtao 的回复:]
引用 1 楼 ouyh12345 的回复:
加锁


对, 但是比如加锁后, 一个线程正在写入, 有N个线程在等待, 那么解锁时要怎样保证接下来的线程执行顺序的?
[/Quote]

或者用信号量、事件

至于保证线程执行顺序,是否可以考虑线程优先级???

全部创建CREATE_SUSPENDED(挂起)的线程
然后再SetThreadPrioriy (设置优先级)
接着再ResumeThread(回复线程)
jackyjkchen 2011-08-14
  • 打赏
  • 举报
回复
如果不想加锁,只能使用时限制使用方式。

首先保证类中没有静态量,然后使用中保证不要共用对象实例
jernymy 2011-08-14
  • 打赏
  • 举报
回复

/// <summary>
/// 取得私有成员值
/// </summary>
int Get() const
{
// 等待锁释放?
return this->m_var;
}
/// <summary>
/// 设置私有成员值
/// </summary>
void Set(int var)
{
// 等待锁释放?则加锁
this->m_var = var;
// 释放锁
}


考虑加上Semaphore会更好些
至善者善之敌 2011-08-14
  • 打赏
  • 举报
回复
MFC孙鑫有一章将的卖票系统,和你这个相似,你可以搜一下看看

线程同步,无它!
jlangtao 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
加锁
[/Quote]

对, 但是比如加锁后, 一个线程正在写入, 有N个线程在等待, 那么解锁时要怎样保证接下来的线程执行顺序的?
jlangtao 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 demon__hunter 的回复:]
找本 win32多线程程序设计 或 windows核心编程 看看吧
[/Quote]

感谢提醒.

不过可惜我没时间去细读.

所以才发帖求助的.
机智的呆呆 2011-08-14
  • 打赏
  • 举报
回复
找本 win32多线程程序设计 或 windows核心编程 看看吧
机智的呆呆 2011-08-14
  • 打赏
  • 举报
回复
ClassA.Get()和ClassA.Set(int)放在同一个临界区里
ouyh12345 2011-08-14
  • 打赏
  • 举报
回复
加锁

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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