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的运行结果就可以输出了,如图所示
#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的运行结果就可以输出了,如图所示
相关文章推荐
- 用BlockBoundQueue和c++11实现多线程生产者消费者问题
- 多线程实现资源共享的问题学习与总结
- 多线程实现资源共享的问题学习与总结
- 如何使用数据库实现多台服务器竞争资源的问题
- 多线程实现资源共享的问题学习与总结
- 多线程竞争资源问题
- 多线程实现资源共享的问题学习与总结
- 多线程实现资源共享的问题学习与总结
- 利用读写锁和智能指针来实现多线程下对资源的多个地方读和多个地方写的实现。
- 再谈权限管理系统问题(权限策略与资源问题:想实现要权限实时申效)
- 自己实现的STL(试图解决多线程的安全问题)
- Linux平台上用C++实现多线程互斥锁
- 多线程:利用互斥锁来处理全局变量的互斥问题
- Linux平台上用C++实现多线程互斥锁
- 多线程下关于硬件资源的释放问题
- java多线程实现生产者与消费者问题
- 多线程互斥锁问题(多线程模拟银行存取款)
- java多线程总结六:经典生产者消费者问题实现
- SerialPort类实现串口通信时遇到的多线程问题
- 在C#中使用SerialPort类实现串口通信 遇到多线程问题