0

问题动机

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

示例代码

编辑: 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 的可怕尝试的任何人表示抱歉。

4

3 回答 3

1

互斥锁不保护变量,它保护代码段。如果访问数据的所有代码段都受到互斥锁的保护,则数据受到保护。如果有任何代码段在不持有互斥锁的情况下访问代码,那么您就有竞争条件和未定义的行为。(换句话说,您需要在设置时使用相同的互斥锁 *flag。)

于 2013-07-09T15:18:01.290 回答
1

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

于 2013-07-09T14:13:38.013 回答
0

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

然后,每当需要对这些变量中的任何一个进行读/写时,互斥锁就会被锁定,然后再解锁。

可能不是异常安全,但它似乎正在工作。

于 2013-07-09T15:42:22.657 回答