一、qt中的互斥量(还没完全弄懂)
主要参考博客:https://blog.csdn.net/u014597198/article/details/75428013(主要运用的还是windows互斥量)
https://blog.csdn.net/zhaoyuaiweide/article/details/77991658
https://blog.csdn.net/kenjianqi1647/article/details/88364544
二、C++中的互斥量
主要参考博客:https://blog.csdn.net/tennysonsky/article/details/77417394
主要参考第一段代码,经过一些整理,以下的例子就能看出加锁与不加锁的问题了。加上头文件<mutex>
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
mutex g_lock; //全局互斥锁对象,#include <mutex>
// 打印机
void printer(const char *str)
{
// g_lock.lock(); //上锁
lock_guard<mutex> lock(g_lock);//如果没有上锁,那打印出来的hello world 就会出现乱码的现象
while (*str != '\0')
{
cout << *str;
str++;
this_thread::sleep_for(chrono::seconds(1));
}
cout << endl;
g_lock.unlock(); //解锁
}
// 线程一
void func1()
{
const char *str = "hello";
printer(str);
}
// 线程二
void func2()
{
const char *str = "world";
printer(str);
}
int main(void)
{
thread t1(func1);
thread t2(func2);
//t1.join();
// t2.join();
while (1);
return 0;
}
注意:查阅资料说一般lock和unlock是同步出现的,但是如果只lock,而没有unlock,我尝试上面代码没有出现问题,具体会出现什么bug,这个留着后期探究
三、windows下的互斥量
主要参考博客:https://blog.csdn.net/arile18/article/details/1575403
主要需要注意的代码:
// 创建互斥量
HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");
// 检查错误代码
if (GetLastError() == ERROR_ALREADY_EXISTS) {
// 如果已有互斥量存在则释放句柄并复位互斥量
CloseHandle(m_hMutex);
m_hMutex = NULL;
// 程序退出
return FALSE;
}