C ++创建原子功能(C++ Creating an atomic function)

2019-09-22 09:54发布

void foo ( Bar* bar , void(Bar::*qux)(void) )
{
    if ( bar )
    {
        bar->qux();
    }
}

问题是:

  1. bar可以被另一个线程检查之后被删除。

  2. 我不能一个互斥体成员添加到Bar ,以将其锁定。

因此,我想,如果我可以告诉原子地运行该功能的处理器,我会怎么办呢? 我花的方式在谷歌大量的时间,但没有发现可以理解的手册...

PS的Debian,GCC,增压不允许的,C ++ 11 允许的。

Answer 1:

的++犯规存在用C像它在Java中,在那里作为同步可以定义一个方法确实原子的方法的概念。 你可以得到在C最接近++将如下创建ScopedMutex类:

class ScopedMutex {
public:
    ScopedMutex(pthread_mutex *m) : theMutex_(m) {pthread_mutex_lock(theMutex_);}
    ~ScopedMutex() { pthread_mutex_unlock(theMutex_); }
    // Add appropriate copy constructors and operator=() to disallow mutex copy
    // Or consider passing in a reference
private:
    pthread_mutex *theMutex_;
};

然后在你的函数中使用这样的:

void foo ( Bar* bar , void(Bar::*qux)(void) )
{
    ScopedMutex m(&aMutex); // This mutex must be defined/initialized elsewhere

    if ( bar )
    {
        bar->qux();
    }

    // The ScopedMutex goes out of scope when the function does,
    // thus releasing the lock
}

但是,这不会给你带来任何好处,除非你在使用的条对象所有其他方法使用相同的互斥。

作用域互斥是特别有用当你有当有几个return语句复杂的逻辑功能,让您不必手动解锁互斥当函数超出范围时,将被解锁。



Answer 2:

你可能想使用共享所有权语义的智能指针(如shared_ptrintrusive_ptr ),以确保对象只要保持活着,你参考一下吧。



Answer 3:

你想暂时分享对象的所有权,以防止其他线程将其删除。 这是一个工作shared_ptr ,使用weak_ptr允许删除时,我们并不需要访问它:

void foo ( std::weak_ptr<Bar> weak_bar , void(Bar::*qux)(void) ) 
{
    if (std::shared_ptr<Bar> bar = weak_bar.lock())
    {
        // We now share ownership of the object - it won't be deleted
        bar->qux();
    }

    // We have released ownership - it can now be deleted
}

当然,你仍然需要同步的,如果多个线程需要访问对象; 这既解决了缺失的问题指定的问题。



Answer 4:

对不起,不行。 C ++没有什么支持。 你不一定需要互斥添加到Bar ,但要避免它,你可能需要周围的包装Bar ,或者说为了的东西。



Answer 5:

我也有在线程1原子执行两个功能的要求。

主线:

   CMythread* pThread = GetThreadFromPool();
   //allocate work to thread
   pThread->ResumeThread();

线程1:

 AddtoThreadPool(this);
 SuspendThread(); //sleep infinitely unless awakened by Main Thread

问题:主线程可以恢复该线程池中曾经中断和线程1(池线程)可以挂起自己无限之前。

解决方法:1.在线程1中执行两个功能原子。 保护再多会工作。 2.定期检查线程池来恢复已分配的工作被挂起的线程。

谢谢您的回答。

阿贾伊



文章来源: C++ Creating an atomic function