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();

就解决问题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值