поменять объекты карты c ++ в многопоточной среде - PullRequest
0 голосов
/ 11 мая 2019

Я новичок в кодировании c ++ и мне нужно поменять / заменить старый мультикартный объект на недавно построенный мультикартный объект, так как этот объект будет кэшироваться. Я хотел бы заменить существующий объект только после создания нового объекта и просто заменить сам объект. Это будет использоваться в многопоточной среде, поэтому используется атомарная загрузка. Как описано в этой теме Хотите эффективный способ поменять местами два указателя в 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};

определенно, я что-то упустил, кто-то может помочь?

1 Ответ

1 голос
/ 11 мая 2019

Вот пример кода, показывающий, как использовать атомарные операции на 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();
}

Выход:

первая строка
первая строка
вторая строка
вторая строка
вторая строка

...