2

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

4

1 回答 1

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
    }
};
于 2013-07-21T12:40:17.530 回答