C++ 将元素添加到c+的多线程中的std::list中,而不使用互斥体+;

C++ 将元素添加到c+的多线程中的std::list中,而不使用互斥体+;,c++,multithreading,stdlist,C++,Multithreading,Stdlist,对于当前代码,输出将显示不同的ml大小。我很困惑,因为这个程序没有崩溃,多线程试图在list\U thread\U safe中更改列表。STD::列表如何处理C++中的?首先谢谢 (取消对互斥体的注释,它将获得相同的ml大小。) #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 std::mutex list\u mutex; 类列表\u线程\u安全{ 公众: 列表线程安全(){ std::cout“…std::list如何处理此问题…” std::list不是线程安全的。

对于当前代码,输出将显示不同的ml大小。我很困惑,因为这个程序没有崩溃,多线程试图在list\U thread\U safe中更改列表。STD::列表如何处理C++中的?首先谢谢

(取消对互斥体的注释,它将获得相同的ml大小。)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
std::mutex list\u mutex;
类列表\u线程\u安全{
公众:
列表线程安全(){
std::cout“…std::list如何处理此问题…”

std::list
不是线程安全的。在多个线程上读取
std::list
是安全的。
但是让多个线程修改列表,或者一个线程修改列表和多个读卡器是不安全的。

如果存在争用条件(两个线程写入同一内存)您的程序有未定义的行为,
std::list
根本无法处理此问题。没有互斥锁的代码因此包含未定义的行为。询问未定义的行为为何具有某些特定效果是毫无意义的。仅供参考,您可以使用
添加一个引号“在多个线程上读取std::list是安全的。”这还不完整!如果你从一个线程添加数据,然后尝试从另一个线程读取数据,你必须与原子、互斥等进行同步…编译器不知道另一个线程正在从第一个线程读取数据!这是UB!@Klaus你似乎没有读过这段的其余部分。我怎么能有一个包含多个读者的列表我看不到任何用例创建了一个列表(至少调用了构造函数),而另一个线程可以在没有任何同步的情况下读取数据。
#include <iostream>
#include <thread>
#include <string>
#include <vector>
#include <map>
#include <unistd.h>
#include <list>
#include <mutex>
#include <algorithm>

std::mutex list_mutex; 
class list_thread_safe {
public:
    list_thread_safe() {
        std::cout<<"construct a list thread safe"<<std::endl;
    }

    ~list_thread_safe() {
        std::cout<<"destruct a list thread safe"<<std::endl;

    }

    void add_to_list(int new_v) {
        // std::lock_guard<std::mutex> guard(list_mutex);

        // add 10 elements to list 
        l.push_back(new_v);    
        l.push_back(new_v);  
        l.push_back(new_v);    
        l.push_back(new_v);     
        l.push_back(new_v);    
        l.push_back(new_v);  
        l.push_back(new_v);    
        l.push_back(new_v); 
        l.push_back(new_v);    
        l.push_back(new_v);  
    }
    std::list<int> l;

};

void add1_times(list_thread_safe& lts,int thread_num, int n) {
    for (int i=0; i< n ; i++) {
        lts.add_to_list(i);
    }
    std::cout<<"thread num "<<thread_num<<" done "<<std::endl;
    std::cout<<"thread list size: "<<lts.l.size()<<std::endl;

}
int main(){
    list_thread_safe ml;
    std::vector<std::thread> ths;
    int thread_num = 10;
    int add_num = 20;
    for(size_t i = 0; i < thread_num; i++)
    {
      printf("%d ", i);
      ths.push_back(std::thread(std::bind(add1_times, std::ref(ml), i, add_num)));
    }

    std::for_each(ths.begin(), ths.end(), std::mem_fn(&std::thread::join));
    std::cout<<"ml size:"<<ml.l.size()<<std::endl;

}