【发布时间】:2013-07-07 04:33:51
【问题描述】:
问题动机
我正在使用互斥锁来保护作为一组线程入口点的函数中的一些变量。我认为互斥锁会保护同一范围内的变量,但它会保护函数参数吗?特别是如果参数是指针。
示例代码
编辑: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 的可怕尝试的任何人表示抱歉。
【问题讨论】:
-
一般规则:每个资源一个互斥锁,每个线程一个锁。
-
我不明白你想说什么。
-
请使用 Markdown 代码格式化工具,而不是
<code>标签。见这里:stackoverflow.com/editing-help#code。这次我冒昧地编辑了你的帖子。 -
Mutex 需要在所有线程之间共享。您的代码将为每个线程创建一个新的本地互斥锁 - 这不会保护任何东西。
-
@EdwardBird: char*(或任何其他变量)只有当您在互斥锁的锁定上下文中访问它时才会受到保护 - 从您访问它的任何地方。因此,在评论中回答您的问题,如果
threadfunction是您访问它的唯一位置,那么它是受保护的。如果您也从其他地方访问它,请确保您也在那里锁定相同的互斥锁。
标签: c++ multithreading thread-safety standard-library