您的位置:首页 > 编程语言 > C语言/C++

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

2015-04-02 16:46 357 查看
//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的运行结果就可以输出了,如图所示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: