C++ 你能帮我把互斥对象应用到这段代码中吗?

C++ 你能帮我把互斥对象应用到这段代码中吗?,c++,mutex,C++,Mutex,我一直在谷歌上搜索互斥器教程/示例,但似乎找不到适合我需要的(或者更可能是我找到了,但从未意识到如何将其应用于我的情况,因为我目前还不完全理解) 我有一个C++回放函数,有2个回调函数。回调函数由第三方程序调用。每个回调函数向全局变量(单独的全局变量)添加信息。还有另外两个函数使用这些全局变量 第三方程序有许多线程,因此随时都在调用回调函数。其他2个函数由用户手动调用。全局变量最终会同时被两个对象访问并导致崩溃 现在全局变量在这样一个类中 class Global { public: stat

我一直在谷歌上搜索互斥器教程/示例,但似乎找不到适合我需要的(或者更可能是我找到了,但从未意识到如何将其应用于我的情况,因为我目前还不完全理解)

我有一个C++回放函数,有2个回调函数。回调函数由第三方程序调用。每个回调函数向全局变量(单独的全局变量)添加信息。还有另外两个函数使用这些全局变量

第三方程序有许多线程,因此随时都在调用回调函数。其他2个函数由用户手动调用。全局变量最终会同时被两个对象访问并导致崩溃

现在全局变量在这样一个类中

 class Global
{
public:
static CString &  get_allscores() {  static CString get_allscores; return get_allscores; }
static CString &  get_allplayers() {  static CString allplayers; return allplayers; }
};
CString allchat; //global variable

void function1()
{
    allchat += "test";
}

void function2()
{
    cout << allchat;
}
有人能给我举一个例子,说明如何使用互斥体和两个同时访问其中一个全局变量的函数吗

谢谢

编辑:

像这样的情况怎么样

 class Global
{
public:
static CString &  get_allscores() {  static CString get_allscores; return get_allscores; }
static CString &  get_allplayers() {  static CString allplayers; return allplayers; }
};
CString allchat; //global variable

void function1()
{
    allchat += "test";
}

void function2()
{
    cout << allchat;
}
CString allchat//全局变量
无效函数1()
{
allchat+=“测试”;
}
无效函数2()
{

cout关于答案的编辑部分:是的,如果这是唯一访问全局数据的函数,那么向这两个函数添加互斥锁将使代码线程安全。当然,危险在于,在开发和维护代码的过程中,忘记了必须使用互斥锁来保护全局数据。当然,该问题的解决方案是将编写的代码封装在一个类中,这样
allchat
就是一个私有成员,向类中添加一个互斥体,并使用访问
allchat

的任何成员函数中的互斥体来访问答案的编辑部分:是的,如果这些是唯一访问全局数据,向两个函数添加互斥锁将使代码线程安全。当然,危险在于,在开发和维护代码的过程中,忘记了必须使用互斥锁来保护这些全局数据。当然,解决该问题的方法是将编写的代码封装在类中,以便
allchat
是一个私有成员,向类中添加互斥体,并使用访问
allchat

的任何成员函数中的互斥体,除非你想接受,否则你应该询问多线程编程书籍,而不是如何在随机代码段中插入互斥体。在你的代码中没有放置互斥体的位置。使用互斥体将要锁定修改全局变量的代码,请执行以下操作。您显示的代码只读取全局变量,因此没有任何用处。您需要添加有关如何写入和读取全局变量的更多详细信息。在解释完其他函数后,我没有添加其他函数,但回调函数会向变量添加信息。我提到的其他两个函数仅读取它们。我强烈建议在写入变量时使用互斥体。您可能希望隐藏它们,只允许setter方法访问它们,并将它们放置在互斥体中。当一个线程写入内存中的某个位置时,另一个线程同时从该位置读取或写入该位置,您将如果存在数据竞争,则代码的行为是未定义的。每当线程写入内存中的某个位置时,必须将读取或写入该内存的任何其他代码从该位置中阻止。对于示例代码中的两个函数,这是不可能的,因为它们将字符串公开给任何想要它们的人。除非你愿意接受,否则我要的是多线程编程书籍,而不是如何在随机代码段中插入互斥体。你的代码中没有放置互斥体的位置。互斥体的用途是锁定修改全局变量的代码。你正在显示的代码只是读取,因此没有用。你需要添加有关全局变量的详细信息写和读。在我解释了其他函数之后,我没有添加它们,但是回调函数为变量添加了信息。我提到的其他两个函数只读取它们。我强烈建议在变量的写操作中使用互斥体。您可能想隐藏它们,只允许通过setter方法访问它们ds并将它们放置在那里。当一个线程在另一个线程从该位置读取或写入该位置的同时写入内存中的某个位置时,您有一个数据争用,并且代码的行为未定义。每当一个线程写入内存中的某个位置时,必须删除读取或写入该内存的任何其他代码锁定了。对于示例代码中的两个函数,这是不可能的,因为它们将字符串公开给任何想要的人。再次感谢Pete,更新没有真正的危险,因为这只是一个用于使用这些函数将数据从一个源传输到另一个源的小dll,此后它基本上不会更改:)。再次感谢Pete,不更新的真正危险在于,因为这只是一个用于使用这些函数将数据从一个源传输到另一个源的小dll,所以在此之后,itll基本上不会更改:)。