使用C++进行线程安全并通过引用传递

Pri*_*tic 5 c++ thread-safety

我想确认我对线程的理解并通过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;
}
Run Code Online (Sandbox Code Playgroud)

我认为它是线程安全的.如果有人能确认我的思考过程,或者告诉我我不知道我在说什么,我会喜欢它:)

  • 进程内存中有两个sA和sB副本.在Thread1的堆栈上创建一个集合,在Thread2的堆栈上创建第二个集合.因为我们通过引用传递,所以每个线程在内存中只需要一组sA和sB来执行函数调用.

  • 如果我们通过值传递,则在进程的内存中最多可以有四个sA和sB副本(每个线程有两个集合),在某个时间点,两个线程都在函数调用中交换处理器控制.

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

对不起,如果这个问题非常简单,那么线程已经让我的大脑变得干脆

PRIS

Ken*_*nde 2

sA您的问题对于和 的sB声明位置有点模糊。听起来它们是在函数内部声明的,在这种情况下,每个线程都有自己的sA和版本是正确的sB。但是,在奇怪的情况下,它们是在全局范围内声明的,但情况并非如此。如果我正确理解你的问题,你的意思是两者是在本地范围内声明的,所以你的第一点是正确的。同样的道理,你的第二点也是正确的。

不过,你的第三点很棘手。在您的特定情况下,没有共享内存,因此您的程序是“线程安全”程序(不确定这是否是一个好说法)。但是,该函数AreStringsEqual不是线程安全的。在将来的某个时刻,您(或其他人)可以使用具有共享数据的函数,并且该函数本身不会防止这种用法。