有效地阅读共享资源

时间:2014-11-16 12:11:39

标签: c++ windows multithreading

我有多个线程,这些线程中的任何一个都可以写入任何其他线程访问的字符串。

我不能同时写和读,但我没有看到任何理由说明我无法从两个不同的线程中读取相同的资源两次。

如何在C ++中允许异步读取字符串,而不允许异步写入和读取?

我设想我会以某种方式等待Mutex的所有权,并以某种方式让其他读操作知道拥有线程正在执行读操作而不是写操作,因此它也可以读取,但我可以'确实放了一个简单的标志,说“我正在读”某个地方,因为一旦第二次读取因标志而忽略互斥锁,第一次读操作就会退出,并且在执行第二次读操作时可能会发生写操作。

我不知道该怎么做。

3 个答案:

答案 0 :(得分:1)

这称为The Readers-Writers Problem

我想,一旦你知道,识别解决方案应该很容易。事实上,链接的文章介绍了其中的一些。

semaphore wrt=1, mutex=1;
readcount=0;

writer()
{
    wait(wrt);
    // Writing is done
    signal(wrt);
}

reader()
{
    wait(mutex);
        readcount++;
        if (readcount == 1)
            wait(wrt);
    signal(mutex);
    // Do the Reading
    // (Critical Section Area)
    wait(mutex);
        readcount--;
        if (readcount == 0)
            signal(wrt);
    signal(mutex);
}

复制其中一个解决方案以防止(不太可能)链接腐烂

答案 1 :(得分:1)

看看boost::shared_mutex

  

类boost :: shared_mutex提供了多读者/单作者互斥体的实现。

答案 2 :(得分:1)

Win32 API为这种情况提供了“Slim Reader / Writer Lock”。它们的设置和使用类似于Critial Sections。 First InitializeSRWLock用于创建锁定对象。在此之后,仅读取器线程在访问共享资源之前调用AcquireSRWLockShared。可能修改资源的线程将使用AcquireSRWLockExclusive。完成访问共享资源后,将使用ReleaseSRWLockShared或ReleaseSRWLockExclusive释放锁。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937(v=vs.85).aspx