2012-07-08 81 views
0

我有一个问题:是std :: map和std :: set线程安全吗?我在我的多线程应用程序中使用这些集合,有时映射并设置作品worng。是std :: map和std :: set线程安全吗?

谢谢!

upd。我的代码:

std::map<int, unsigned long> ClientTable; 

int sendulong(int socket, char * data) //<--- Many threads uses this function 
{ 
    write(socket, ClientTable[socket]); //<--- ClientTable[[socket] <-- using of map 
} 

我怎么能解决线程安全的代码? 谢谢!

+0

代码*错*。写入的调用有太多的'[',并且缺少'size'参数。在谈论多线程时,您应该清楚操作的组合是什么。尤其是所有线程是否只是读取,或者可能有线程同时写入容器。 – 2012-07-08 11:43:12

+0

@DavidRodríguez-dribeas。感谢您的回答。我的组合:一个线程是编写的,一个是线程阅读的平均值。什么多线程方案会很好?我没有多线程编程经验( – Robert 2012-07-08 11:47:26

+0

[我需要保护对多线程环境中STL容器的读访问吗?](http://stackoverflow.com/questions/187583/do-i-need-to -protect-read-access-to-stl-container-in-a-multithreading-environ) – 2012-07-08 12:41:22

回答

3

C++标准对此没有任何说明1您必须查看您正在使用的标准库的特定实现的文档。但它很可能不会是线程安全的,因此您需要自己进行同步。

(如果你想知道如何做到这一点,好,这是一个不同的问题的主题......)


1.预C11。

+3

C++ 11给出了容器的数据争用要求,参见23.2.2节,这在库之前基本上是标准的,因为它是唯一的合理选择 – 2012-07-08 14:00:52

3

不,它们没有被定义为线程安全的。您必须在标准库容器之上添加同步机制。

6

这取决于你想要做什么。如果你所做的只是从他们那里读取,那么是的。如果你也写信给他们,并且一个单独的线程试图做其他事情,或者有活着的迭代器,它将无法按预期工作。

+2

你必须在_修改容器结构_和_修改container_中的项目之间分开。通常,您可以同时修改容器中的两个不同元素,而不会引入数据竞争。 – 2012-07-08 14:01:53

相关问题