相关疑难解决方法(0)

需要一些关于如何使类"线程安全"的反馈

我目前正在学习如何在C++中进行多线程处理.我的一个学习项目是俄罗斯方块游戏.在这个项目中,我有一个包含所有游戏状态数据的Game类.它有移动块的方法和其他一些东西.用户(将使用箭头键从主线程移动块)访问此对象,同时线程计时器在活动块上实现重力(定期降低它).

起初我以为我可以通过添加互斥成员变量并将其锁定在每个方法调用中来使Game类线程安全.但问题是它只保护单个方法调用,而不是涉及多个方法调用的更改.例如:

// This is not thread-safe.
while (!game.isGameOver())
{
    game.dropCurrentBlock();
}
Run Code Online (Sandbox Code Playgroud)

我尝试的一个解决方案是为互斥变量添加一个访问器方法,以便从外部锁定它:

// Extra scope added to limit the lifetime of the scoped_lock.    
{
    // => deadlock, unless a recursive mutex is used
    boost::mutex::scoped_lock lock(game.getMutex());
    while (!game.isGameOver())
    {
        game.dropCurrentBlock();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,除非使用递归互斥锁,否则这将会死锁.现在,看看StackOverflow 上的一些 帖子,似乎有多数人强烈反对使用递归互斥锁.

但是,如果递归互斥锁是非选项,那么这是否意味着创建一个线程安全类(支持协调更改)变得不可能?

唯一有效的解决方案似乎是永远不会在方法调用中锁定互斥锁,而是始终依赖用户从外部进行锁定.

但是,如果是这种情况,那么简单地将Game类保持原样不是更好,并创建一个将Game对象与互斥锁配对的包装类?

更新

我尝试了包装器的想法并创建了一个名为ThreadSafeGame(cpp)的类,如下所示:

class ThreadSafeGame
{
public:
    ThreadSafeGame(std::auto_ptr<Game> inGame) : mGame(inGame.release) {}

    const Game * getGame() const
    { return mGame.get(); }

    Game * getGame()
    { return mGame.get(); …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading design-patterns

17
推荐指数
1
解决办法
1万
查看次数

标签 统计

c++ ×1

design-patterns ×1

multithreading ×1