gpt4 book ai didi

c++ - C++ 的线程安全和引用传递

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:45 27 4
gpt4 key购买 nike

我想确认我对 C++ 中的线程和引用传递的理解。以下函数线程安全吗?

QString sA = "hello";
QString sB = "world";
bool someFlag = AreStringsEqual(sA,sB);

...

bool AreStringsEqual(QString const &stringA, QString const &stringB)
{
if(stringA == stringB)
{ return true; }

return false;
}

我认为它线程安全的。如果有人可以确认我的思维过程,或者告诉我我不知道我在说什么,我会很高兴 :)

  • 进程内存中有sA和sB的两个拷贝。一组在 Thread1 的堆栈上创建,第二组在 Thread2 的堆栈上创建。因为我们是引用传递,所以每个线程在内存中只需要一组sA和sB就可以执行函数调用。

  • 如果我们改为按值传递,则在两个线程在函数内交换处理器控制权的某个时间点,进程的内存中最多可能有四个 sA 和 sB 的拷贝(每个线程有两个集合)打电话。

  • 在任何情况下都不会在这里共享内存,因此该函数是线程安全的。

抱歉,如果这个问题 super 简单,线程已经炸了我的脑袋:)

棱镜

最佳答案

两个线程没有理由不保存对相同字符串的引用。

此函数不是线程安全的,因为语句if(stringA == stringB) 不是原子的。首先从内存中获取 stringA,然后才获取 string B

让我们保持 stringA == stringB == 2

您获取 stringA,然后进行上下文切换,stringA 和 stringB 都变为 3。然后您获取 stringB。尽管 stringA 始终等于 stringB,但您的函数将返回 false(因为 2 != 3)。

关于c++ - C++ 的线程安全和引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8708730/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com