std::string标准库的一个copy-on-write在多线程中的一个坑

std::string ms_tasks;
std::mutex ms_tasks_mutex;

void AddTask(const std::string& task)
{
	std::lock_guard<std::mutex> _lock(ms_tasks_mutex);

	//...
    ms_tasks = task;
    //...
}

void DealTask()
{
    std::lock_guard<std::mutex> _lock(ms_tasks_mutex);

    //read and wirte ms_tasks here
    //...
}

//线程1
void poll1()
{
    while(...)
    {
        std::string s=...
        //...
        AddTask(s);
        //...
        //sleep some time
    }
}

//线程2
void poll2()
{
    while(...)
    {
        //...
        DealTask();
        //...
        //sleep some time
    }
}

类似以上的代码,运行一段时间后就崩了,两线程同时操作同一字符串,我已加锁,看了这编文章后恍然大悟:

https://www.cnblogs.com/alantu2018/p/8503270.html

原来是触发了std::string的copy-on-write机制了。

把代码改成:

ms_tasks = task.c_str();

就解决问题了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多线程环境下,使用 `std::promise` 返回 `std::any` 时需要注意线程安全。可以使用 `std::shared_ptr` 来确保多个线程可以访问同一个 `std::promise` 和 `std::future` 对象。 例如,可以创建一个 `std::shared_ptr`,并将其传递给多个线程。每个线程都可以通过该 `std::shared_ptr` 访问 `std::promise` 和 `std::future` 对象,然后在 `std::promise` 设置值,最后在 `std::future` 获取值。 下面是一个示例代码: ```c++ #include <iostream> #include <thread> #include <future> #include <any> class MyAny { public: MyAny(std::any value) : value_(std::move(value)) {} std::any getValue() { return value_; } private: std::any value_; }; void worker(std::shared_ptr<std::promise<MyAny>> p) { std::any value = 42; MyAny myValue(value); p->set_value(myValue); } int main() { std::shared_ptr<std::promise<MyAny>> p = std::make_shared<std::promise<MyAny>>(); std::future<MyAny> f = p->get_future(); std::thread t(worker, p); MyAny result = f.get(); std::any resultValue = result.getValue(); std::cout << std::any_cast<int>(resultValue) << std::endl; t.join(); return 0; } ``` 在上面的示例代码,我们首先创建一个 `std::shared_ptr`,然后将其传递给一个线程和 `std::promise` 对象。线程可以通过该 `std::shared_ptr` 访问 `std::promise` 对象,并在其设置一个值。主线程可以通过 `std::future` 对象获取该值,并通过 `MyAny` 类的方法获取 `std::any` 类型的值。需要注意的是,在主线程获取值之前,必须确保线程已经完成并设置了该值。在本例,我们使用 `std::thread::join` 等待线程完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值