Gau*_*v K 3 multithreading c++11
参考RAII
我可以使用static mutex的critical section为:
#include <string>
#include <mutex>
#include <iostream>
#include <fstream>
#include <stdexcept>
void write_to_file (const std::string & message) {
// mutex to protect file access
static std::mutex mutex;
// lock mutex before accessing file
std::lock_guard<std::mutex> lock(mutex);
// try to open file
std::ofstream file("example.txt");
if (!file.is_open())
throw std::runtime_error("unable to open file");
// write message to file
file << message << std::endl;
// file will be closed 1st when leaving scope (regardless of exception)
// mutex will be unlocked 2nd (from lock destructor) when leaving
// scope (regardless of exception)
}
Run Code Online (Sandbox Code Playgroud)
如果对类成员函数使用相同的方法,例如:
class Test{
public:
void setI(int k)
{
static std::mutex mutex;
std::lock_guard<std::mutex> lock(mutex);
i=k;
}
private:
int i;
};
Run Code Online (Sandbox Code Playgroud)
上述方法的优缺点是什么?
使用以下方法是否更可取:
class Test
{
public:
void setI(int k)
{
std::lock_guard<std::mutex> lock(mutex);
i = k;
}
private:
int i;
std::mutex mutex;
};
Run Code Online (Sandbox Code Playgroud)
哪种方法保证线程安全更好?
小智 6
“在成员函数中声明的静态变量将在函数调用之间保持它们的值。所有实例中只有一个副本”
您的两种解决方案都是“有效的”,这实际上取决于您要完成的工作...
成员函数内的静态互斥变量
此解决方案为类的所有实例提供一个互斥锁。它将有效地提供线程安全,但如果您有许多对象分布在不同的线程中,则可能不是最佳的性能。互斥量也仅限于该单个函数,因此通常这会使实现不切实际。因此,静态私有变量通常更好。
类内的私有互斥变量
使用此解决方案,您可以为类的每个实例获得一个互斥锁。为您的类提供线程安全以便多个线程可以访问它是有效的。这通常是更优选的解决方案,因为它允许不同的线程同时访问不同的对象。但是,这不足以保护对类的静态成员的访问。
大多数情况下,您希望在类中拥有一个私有的非静态互斥锁。
| 归档时间: |
|
| 查看次数: |
12815 次 |
| 最近记录: |