Categories
不学无术

C++11里头的thread初探

C++11标准给了很多“终于等到了”的功能,其中一项就是线程类<thread> ,有朝一日终于可以减少操作系统相关了,隔壁J家笑而不语。
 
用法真是简单多了,最简单的一种如下:

#include <thread>
#include <iostream>
using namespace std;
void pause_thread(int n) {
	this_thread::sleep_for(chrono::seconds(2));
	cout << "thread of " << n << " ended\n";
}
int main() {
	int N = 0;
	cin >> N;
	thread* ths = new thread[N];
	for (int i = 0; i < N; i++) {
		ths[i] = thread(pause_thread, i);
	}
	cout << "Finished spawning threads." << endl;
	for (int i = 0; i < N; i++) {
		ths[i].join();
	}
	cout << "All threads joined!" << endl;
	delete[]ths;
	return 0;
}

上面程序的输出:
cpp11_thread
当然由于我的函数里定义的不是原子操作,所以cout的时候就混杂了~
所以可以用到<mutex> 类里面的互斥量来解决一下,比如这样

#include <thread>
#include <mutex>
#include <iostream>
using namespace std;
void pause_thread(int n, mutex* mtx) {
	this_thread::sleep_for(chrono::seconds(2));
	(*mtx).lock();
	cout << "thread of " << n << " ended\n";
	(*mtx).unlock();
}
int main() {
	int N = 0;
	cin >> N;
	thread* ths = new thread[N];
	mutex mtx;
	for (int i = 0; i < N; i++) {
		ths[i] = thread(pause_thread, i, &mtx);
	}
	cout << "Finished spawning threads." << endl;
	for (int i = 0; i < N; i++) {
		ths[i].join();
	}
	cout << "All threads joined!" << endl;
	delete[]ths;
	return 0;
}

然后我们可以看到,输出不会绕在一起了~当然还是无序的,哈哈
cpp11_mutex
 
查文档的时候注意到,竟然还有死锁检测相关的exception可能会抛出,有点良心的…这几天好好研究一下~
 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.