gpt4 book ai didi

c++ - 在多线程环境中交换 c++ 映射对象

转载 作者:行者123 更新时间:2023-11-28 04:18:12 26 4
gpt4 key购买 nike

我是 C++ 编码的新手,需要用新构建的多映射对象交换/替换旧的多映射对象,因为这个对象将被缓存我想只在构建新对象后替换现有对象,只是替换对象本身。这将在多线程环境中使用,因此使用原子加载。如本主题所述Want an efficient way to swap two pointers in C++ .我写了这段代码

#include<iostream>
#include<map>
#include<atomic>
#include<string>
using namespace std;

// MultiMap Object
struct mmap{
multimap<string,int> stringTointmap;
};

// Structure to swap two instances of multimap
struct swapMap{
mmap* m1;
mmap* m2;
};

int main(){

//create Two Objects
mmap* old = new mmap();
mmap* new2= new mmap();

// populate first object
old->stringTointmap.insert(make_pair("old",1));
//populate second object
new2->stringTointmap.insert(make_pair("new1",2));

//swap two objects
atomic<swapMap> swap;
auto refresh=swap.load();
refresh= {swap.m2,swap.m1};
}

但是我得到了这个错误

error: expected expression
refresh= {swap.m2,swap.m1};

当然,我遗漏了什么,有人可以帮忙吗?

最佳答案

这里的示例代码展示了如何在 std::shared_ptr 上使用原子操作来完成它。

#include <memory>
#include <thread>
#include <chrono>
#include <atomic>
#include <iostream>

std::shared_ptr<std::string> the_string;

int main()
{
std::atomic_store(&the_string, std::make_shared<std::string>("first string"));

std::thread thread(
[&](){
for (int i = 0; i < 5; ++i)
{
{
// pin the current instance in memory so we can access it
std::shared_ptr<std::string> s = std::atomic_load(&the_string);

// access it
std::cout << *s << std::endl;
}
std::this_thread::sleep_for(std::chrono::seconds(1));
}
});

std::this_thread::sleep_for(std::chrono::seconds(2));

// replace the current instance with a new instance allowing the old instance
// to be removed when all threads are done with it
std::atomic_store (&the_string, std::make_shared<std::string>("second string"));

thread.join();
}

输出:

first string
first string
second string
second string
second string

关于c++ - 在多线程环境中交换 c++ 映射对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56086143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com