1、对于多线程安全这个概念我得理解是,不过我得程序是不是多线程,当我之用这个类的时候都不用对这个类的实例资源进行资源竞争的管理。不知我得理解是否正确。
2、我现在想写多线程安全的类,但是在我动手写这个类的时候发现了一些很矛盾的事情。问题描述如下:
当我要写一个类,而这个类会有一些可能会在多线程中产生资源竞争的资源。我可以通过互斥变量来对他们进行保护。但是我只能做到在这个类的某个函数被运行时不会有其他线程来打扰。但是当我运行完此函数,从中得到一些资源后,我本想对这个资源进行一些操作。但这时另一个线程开始执行,并删除了我得到的这个资源。这时我的当前线程又开始执行,但我之前得到的资源已经被插进来的线程给删去了。这种资源保护只能放在类库外才能控制,我的类库是不可能控制的。但如果在类库外有了这种控制,那么我类库中的控制就完全没有意义了。
那么请问这种情况应该如何处理?是不是我在写这种底层库时没有必要写成多线程安全呢?
3、像线程池、内存池、连接池这类类库我觉得都会碰到这类问题,请问这些一般是如何实现的,如果有相关的代码那更好。
期待高手的解答。
8 个解决方案
1 一般单线程是不需要考虑同步
2 保护的对象应该不是函数吧,只是需要保护函数访问每个共用数据,类的实例如果访问的不是共享数据业不需要保护。
laiyiling(【CSDN●目标】) 可能误解了我的意思。我不是要保护函数。我举个最简单的例子吧。
class connectpool
{
private:
list m_connPool;\\这是个链表对象作为连接池,是个共享资源
public:
getConnect();\\可以返回一个有效的连接,此函数会访问m_connPool。
freeConnect();\\将一个连接释放,此函数也会访问m_connPool。
}
connectpool::getConnect()
{
上锁
获取有效连接
解锁
}
connectpool::freeConnect(要释放的连接)
{
上锁
释放指定连接
解锁
}
那么我的多线程程序在用这个类的时候就有可能一个线程刚得到有效连接,另一个线程就把他给释放掉了。那么在这种情况下我写的这个类是不是就不算是多线程安全的类了呢?是否有办法解决呢?如果说不能保证多线程安全我是不是就没有必要非得在写类的时候就考虑多线程问题,而把问题放在应用程序中考虑?
如果一个线程正在使用(或者现在没有占用,但是以后会用)m_connPool,应一个线程可能会释放m_connPool,就说明软件架构除了问题,即使上锁也没办法,总不能一直锁上
感觉应该把m_connPool看作共享资源,上锁解锁应该针对m_connPool。
不知道是不是这个意思
orbit,cyblueboy83说的都是如何解决我描述的这种情况。而且我也同意二位说的。但是其实真正想知道的是,既然我们在写类时无法保证外围程序由于框架上的问题造成多线程问题,那么我们是不是没有必要写一个多线程安全的类,把这些问题都交给调用我们的类的程序去解决?stl库就是因为这个原因而没有写多线程安全的版本的。