C++11实现多线程 互斥锁与资源竞争问题

来源:互联网 发布:中国帝国 知乎 编辑:程序博客网 时间:2024/06/10 11:21

//MThread.h

#include <iostream>

#include <thread>
#include <mutex>

class MThread
{
public:
MThread(int x);
~MThread();
static void run(int x);
std::thread threads;

private:
int x;

};


//MThread.cpp

#include "MThread.h"
#include <iostream>
#include <Windows.h>

std::mutex mutex;

MThread::MThread(int x)
{
this->x = x;
this->threads = std::thread(run, this->x);
}


MThread::~MThread()
{
}


void MThread::run(int x)
{
for(int i = 0; i < 20; i++;)
{
if(mutex.try_lock())
{
std::cout << "线程" << x << "第" << i + 1 << "次执行" << std::endl ;
mutex.unlock();

}
}
}


//main.cpp


#include <iostream>
#include <thread>
#include <mutex>
#include "MThread.h"

int main (int argc, const char* argv[]) 

{
MThread * mt[3];

for(int i = 0; i < 3; i++)
{
mt[i] = new MThread(i + 1);
}

for(auto &th : mt)
th->threads.join();

    return 0;
}

如图所示,线程2和3的输出并没有被调用。仔细观察程序就能发现,不是线程2和3没有运行,而是当线程2和3进行try_lock()的时候,没有成功,但是仍然进行了i++操作,所以如果把MThread.cpp中的run方法改成

void MThread::run(int x)
{
for(int i = 0; i < 20; )
{
if(mutex.try_lock())
{
std::cout << "线程" << x << "第" << i + 1 << "次执行" << std::endl ;
mutex.unlock();
i++;
}
}
}

线程2和3的运行结果就可以输出了,如图所示


0 0
原创粉丝点击