一、mutex互斥量
互斥量是在多线程并发中避免数据竞争的一种锁。 它有三个常用函数:
lock() 加锁unlock() 解锁try_lock() 尝试加锁(不阻塞)
二、使用示例
#include <iostream>
#include <mutex>
#include <vector>
#include <string>
#include <ctime>
#include <thread>
using namespace std;
string mock_msg()
{
char buff[64] = { 0 };
time_t time_result = time(nullptr);
tm tm;
localtime_s(&tm, &time_result);
strftime(buff, sizeof(buff), "%Y-%m-%d %H:%M:%S", &tm);
return buff;
}
class CMutexTest
{
public:
void recv_msg();
void read_msg();
private:
vector<string> msg_queue;
mutex m_mutex;
};
void CMutexTest::recv_msg()
{
while (true)
{
string msg = mock_msg();
cout << "recv the msg " << msg << endl;
m_mutex.lock();
msg_queue.push_back(msg);
m_mutex.unlock();
}
}
void CMutexTest::read_msg()
{
if (m_mutex.try_lock())
{
if (!msg_queue.empty())
{
string msg = msg_queue.front();
cout << "read the msg " << msg << endl;
msg_queue.erase(msg_queue.begin());
}
m_mutex.unlock();
}
else
{
this_thread::sleep_for(chrono::seconds(1));
}
}
int main()
{
CMutexTest my_test;
thread recv_thread(&CMutexTest::recv_msg, &my_test);
thread read_thread(&CMutexTest::read_msg, &my_test);
recv_thread.join();
read_thread.join();
}
三、总结
互斥量是C++多线程编程中非常基础的一个知识点,它的lock是阻塞的,而try_lock是非阻塞的会立即返回。在实际应用中要考虑不同场景来选择使用,对于线程中有其他任务要处理的应考虑选择非阻塞的try_lock。
|