参考:

http://www.oschina.net/translate/cplusplus-11-threading-make-your-multitasking-life

http://blog.jobbole.com/44409/

线程

类std::thread代表一个可执行线程,使用时必须包含头文件<thread>。std::thread可以和普通函数,匿名函数和仿函数(一个实现了operator()函数的类)一同使用。另外,它允许向线程函数传递任意数量的参数。

#include <thread>

void func()
{
// do some work
} int main()
{
std::thread t(func);
t.join(); return ;
}

上例中,t 是一个线程对象,函数func()运行于该线程中。对join()函数的调用将使调用线程(本例是指主线程)一直处于阻塞状态,直到正在执行的线程t执行结束。如果线程函数返回某个值,该值也将被忽略。不过,该函数可以接收任意数量的参数。

 void func(int i, double d, const std::string& s)
{
std::cout << i << ", " << d << ", " << s << std::endl;
} int main()
{
std::thread t(func, , 12.50, "sample");
t.join(); return ;
}

尽管可以向线程函数传递任意数量的参数,但是所有的参数应当按值传递。如果需要将参数按引用传递,那要向下例所示那样,必须将参数用std::ref 或者std::cref进行封装。

void func(int& a)
{
a++;
} int main()
{
int a = ;
std::thread t(func, std::ref(a));
t.join(); std::cout << a << std::endl; return ;
}

该程序打印结果为43,但是如果不用std::ref把参数a进行封装的话,输出结果将为42

Detach: 允许执行该方法的线程脱离其线程对象而继续独立执行。脱离后的线程不再是可结合线程(你不能等待它们执行结束)。

int main()
{
std::thread t(funct);
t.detach(); return ;
}

互斥Mutex

C++ 11的<mutex>头文件里包含了四种不同的互斥量:

  • Mutex: 提供了核心函数 lock() 和 unlock(),以及非阻塞方法的try_lock()方法,一旦互斥量不可用,该方法会立即返回。
  • Recursive_mutex:允许在同一个线程中对一个互斥量的多次请求。
  • Timed_mutex:同上面的mutex类似,但它还有另外两个方法 try_lock_for() 和 try_lock_until(),分别用于在某个时间段里或者某个时刻到达之间获取该互斥量。
  • Recursive_timed_mutex: 结合了timed_mutex 和recuseive_mutex的使用。

std::mutex与win32的临界区(cirtical section)很类似。lock()如同EnterCriticalSection,unlock如同LeaveCriticalSection,try_lock则像TryEnterCriticalSection。

std::mutex m;
int j = ;
void foo()
{
m.lock(); // 进入临界区域
j++;
m.unlock(); // 离开
}
void func()
{
std::thread t1(foo);
std::thread t2(foo);
t1.join();
t2.join();
// j = 2;
}

如上,你在lock一个 std::mutex 对象之后必须解锁(unlock)。如果你已经对其加锁,你不能再次lock。这与win32 不同,如果你已经在临界区(critical section)里,再次 EnterCriticalSection不会失败,但是会增加一个计数。

嗨,不要走开哦。前面提到不能对std::mutex重复lock。这里有std::recursive_mutex(谁发明的这名字),它的行为则与临界区(critical section)相似,可以重复lock。

std::recursive_mutex m;
void foo()
{
m.lock();
m.lock(); // now valid
j++;
m.unlock();
m.unlock(); // don't forget!
}

最新文章

  1. HTTPS时代全面到来,你准备好了吗?
  2. Python的魔法方法 .
  3. 【Netbeans】表格的使用
  4. 7 种流行 PHP IDE 的比较
  5. Intersoft Mobile Studio 2013 R1 SP1 Crack
  6. JS如何封装一些列方法为一个对象的操作,然后集中管理这些操作,方便修改和调用
  7. 《招聘一个靠谱的iOS》面试题参考答案(下)
  8. iOS_block内存分析
  9. Code Forces 448C Painting Fence 贪婪的递归
  10. WEB 表格测试点
  11. 【翻译】在Ext JS应用程序中使用自定义图标
  12. vegas 为盖斯
  13. 详解:idea工具下的main函数只执行Thread.activeCount(),打印值为:2
  14. bootstrap图片轮播
  15. hdu 5381
  16. 3237: [Ahoi2013]连通图 线段树分治
  17. Asp.Net 隐藏手机号中间四位为*方法
  18. 输出单个文件中的前 N 个最常出现的英语单词,并将结果输入到文本文件中。程序设计思路。
  19. 更多内容 - 请关注我的 CSDN 博客
  20. 轻量级ORM框架Dapper应用八:使用Dapper实现DTO

热门文章

  1. python---堡垒机开发
  2. servlet程序使用tomcat启动报错
  3. codevs 1500 后缀排序
  4. SQL语句(十八_补充)——存储过程
  5. ICDM Winner&#39;s Interview: 3rd place, Roberto Diaz
  6. 同一条sql语句,只是改变了搜索的条件,就很慢?
  7. 可供选择CSS框架
  8. 浅谈欧几里得算法求最大公约数(GCD)的原理及简单应用
  9. C++中getline()和cin()同时使用时的注意事项
  10. Pythagorean Triples(Codeforces Round #368 (Div. 2) + 构建直角三角形)