我正在使用互斥锁来保护函数中的某些变量,该函数是一组线程的入口点。我认为互斥锁将保护同一范围内的变量,但是它会保护函数参数吗?特别是如果参数是指针。
编辑: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的可怕尝试的人表示抱歉。
答案 0 :(得分:1)
索引不是“受保护的”,但它是一个局部变量,所以没有什么可以保护的。但是你关心国旗的内容是正确的。你的互斥锁阻止其他线程运行此函数的主体,但它不会阻止其他代码访问标志的内存(假设它们有自己的地址)。
答案 1 :(得分:1)
互斥锁不保护变量,它保护部分
码。如果访问数据的所有代码段都是
受互斥锁保护,数据受到保护。如果有的话
代码段,无需保存即可访问代码
互斥,然后你有一个竞争条件和未定义的行为。
(换句话说,设置时需要使用相同的互斥锁
*flag
。)
答案 2 :(得分:0)
对于我正在处理的实际代码,我在代码中使用需要保护的变量声明了互斥锁'std :: mutex mMutex'。
然后,只要需要对这些变量中的任何一个进行读/写操作,就会锁定互斥锁,然后解锁。
可能不是例外安全,但似乎有效。