C++ 线程安全双向链表

标签 c++ windows data-structures

我正在编写的应用程序需要上述数据结构。我想知道是否有一个库已经实现了它,或者我是否必须自己编写它?

如果没有必要,我真的不想重新发明轮子。

我需要这个结构能够使用多个线程添加和删除项目,而不必在这样做时锁定整个结构。

最佳答案

可能有,但我认为这是 Java 早期的教训之一 - 数据同步通常不在容器的成员函数级别,而是在上面的一个步骤。您应该在访问非线程安全列表之前使用同步对象。

考虑:

ThreadSafeQueue tsq;
tsq.push_back(...); // add lots of data

...

// Find the first element that returns true for search_criteria(elem);
auto iter = tsq.find_if(search_criteria); 
// (1)                                  
if(iter != tsq.end()) // (2)
{
    tsq.erase(iter);
}

在这个线程安全的队列中,仍然有两个“间隙”,队列可以被另一个线程改变。而且,实际上,您的迭代器可能会因这些更改而失效。现在比较:

Queue q;
q.push_back(...); // add lots of data

...

// Create some lock around a pre-existing mutex.
Lock lock(q_mutex);
// Find the first element that returns true for search_criteria(elem);
auto iter = q.find_if(search_criteria); 

if(iter != q.end())
{
    q.erase(iter);
}
// lock unlocks as it goes out of scope.

这里因为锁的粒度比较大,所以可以保证整个写算法的一致性。

关于C++ 线程安全双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3698847/

相关文章:

c++ - 使用 Cilk 数组表示法和 STL vector

c++ - 为什么我在类中初始化私有(private)数据成员没有成功?

windows - 在一定时间后停止 Windows 任务计划程序任务

java - 只需要支持随机访问和追加的线程安全列表

algorithm - 如何用链表实现一个不相交集的数据结构?

c++ - 来自子控件的键盘消息

c++ - 为什么 static_cast 在逻辑上应该出于安全目的拒绝它们或者 static_cast 与安全无关时允许向下转换?

c++ - 如何在打开的管理员程序中调用 system() 并赋予它相同的权限?

c# - 如何在 Windows Phone 7.1 中打开文件?

c++ - 初始化结构包含对结构的引用