C ++互斥和函数参数

时间:2013-07-09 14:08:59

标签: c++ multithreading thread-safety standard-library

问题动机

我正在使用互斥锁来保护函数中的某些变量,该函数是一组线程的入口点。我认为互斥锁将保护同一范围内的变量,但是它会保护函数参数吗?特别是如果参数是指针

示例代码

编辑:Mutex在main中声明,否则它不起作用 - 傻我。

我有这样的功能:

void threadfunction(int index, char* const flag)
{
    //std::mutex m;
    std::lock_guard<std::mutex> lock(m);

    // Is this thread safe?
    if(*flag) { *flag = 0; index ++; }
}

int main()
{
    std::mutex m;
    std::vector<std::thread> threadvec;
    threadvec.push_back(std::thread(threadfunction)); // Or whatever it is
    ... join ...
}

我猜你可以看到问题:由于参数与互斥锁的范围相同,我认为索引是受保护的。但是,虽然我认为存储在'char * const flag'中的地址是线程安全的,但我猜测'* flag'不是。这是正确的,有解决方案吗?

由于

PS:对任何编辑问题并且必须处理我对html的可怕尝试的人表示抱歉。

3 个答案:

答案 0 :(得分:1)

索引不是“受保护的”,但它是一个局部变量,所以没有什么可以保护的。但是你关心国旗的内容是正确的。你的互斥锁阻止其他线程运行此函数的主体,但它不会阻止其他代码访问标志的内存(假设它们有自己的地址)。

答案 1 :(得分:1)

互斥锁不保护变量,它保护部分 码。如果访问数据的所有代码段都是 受互斥锁保护,数据受到保护。如果有的话 代码段,无需保存即可访问代码 互斥,然后你有一个竞争条件和未定义的行为。 (换句话说,设置时需要使用相同的互斥锁 *flag。)

答案 2 :(得分:0)

对于我正在处理的实际代码,我在代码中使用需要保护的变量声明了互斥锁'std :: mutex mMutex'。

然后,只要需要对这些变量中的任何一个进行读/写操作,就会锁定互斥锁,然后解锁。

可能不是例外安全,但似乎有效。