【问题标题】:mutex lock in multi-thread can I use several mutex locks多线程中的互斥锁我可以使用几个互斥锁吗
【发布时间】:2013-07-21 12:33:55
【问题描述】:

我想实现一个创建 5 对线程的功能(一对意味着一个线程写入,另一个线程读取,并且两个线程共享一个列表(在这种情况下为 5 个列表)。 我需要创建五个互斥锁吗?如何声明它们?在全球范围内?

【问题讨论】:

    标签: c++ pthreads mutex


    【解决方案1】:

    我需要创建五个互斥锁吗?

    取决于您的数据结构。如果您有五个不同的数据对象要从五个关联的线程对安全访问,则需要五个,如果所有线程只访问一个数据对象,您只需要一个。

    如何声明它们?在全球范围内?

    将您的数据对象、互斥锁和(写入)线程函数封装在一个类中。我会说您不需要另一个阅读线程,即通常调用 run 的线程,或者任何其他可以访问此类实例的线程。

    class MyAsynchDataProvider
    {
    public:
    
        void run()
        {
            writeThread = std::thread(writeDataFunc,this);
        }
    
        MyDataStruct getSafeDataCopy()
        {
            std::lock_guard lock(dataGuard);
            return data;
        }
    
    private:
        std::mutex dataGuard;
        MyDataStruct data;
    
        std::thread writeThread;
    
        static void writeThreadFunc(MyDataWorker* thisPtr)
        {
            // ...
            std::lock_guard lock(thisPtr->dataGuard);
            // Write to thisPtr->data member
        }
    };
    

    【讨论】:

    • 你能给我举一个类中封装的互斥锁的例子吗?
    • @Ericzhang88120 够好吗?
    • 我的两个线程不在同一个类中。所以他们可能需要共享同一个锁
    • @Ericzhang88120 然后公开data 成员上的操作,其他类可以使用,将lock_guard 放在这些方法中。
    • @Ericzhang88120 THX 接受,希望你能得到精华并应用到你的用例中。这同样适用于直接使用 pthread 库(您只需保留 pthread_t 句柄和 pthread_mutex_t 句柄的成员,而不是 std 的东西)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2012-12-25
    • 2021-02-19
    相关资源
    最近更新 更多