c++11多线程学习笔记之二 mutex使用

// 1111111.cpp : 定义控制台应用程序的入口点。
//

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

int gcounter = 0;
std::mutex gmtx;
std::mutex gmtxOutput;

void Increases() {
	for (int i = 0; i<10000; ++i) {
		if (gmtx.try_lock()) {   // only increase if currently not locked:
			++gcounter;
			gmtx.unlock();
		}
		else{
			gmtxOutput.lock();
			std::cout << "try lock failed" << std::endl;
			gmtxOutput.unlock();
		}
	}
}

int _tmain(int argc, _TCHAR* argv[]) {
	std::thread threads[10];
	for (int i = 0; i<10; ++i)
		threads[i] = std::thread(Increases);

	for (auto& th : threads)
		th.join();
	std::cout << "counter is " << gcounter << std::endl;

	return 0;
}

输出:

try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
try lock failed
counter is 99983
请按任意键继续. . .

这个例子说明了 try_lock() 与 lock()的区别

try_lock()会对能否上锁进行测试 并返回布尔值

而lock()则直接进行锁定 不能锁定则阻塞直到锁定

时间: 2024-10-11 16:43:05

c++11多线程学习笔记之二 mutex使用的相关文章

c++11多线程学习笔记之三 condition_variable使用

从windows角度来说,condition_variable类似event. 阻塞等待出发,不过condition_variable可以批量出发. 代码如下: // 1111111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <thread> #include <mutex> #include <condition_variable>

c++11多线程学习笔记之一 thread基础使用

没啥好讲的  c++11  thread类的基本使用 #include "stdafx.h" #include <iostream> #include <thread> void Func(int n) { for (int i = 0; i < 3; ++i) std::cout << "func " << i << std::endl; } void RefFunc(int& n) { f

c++11多线程学习笔记之四 生产消费者

#ifndef MY_QUEUE_H__ #define MY_QUEUE_H__ #include<list> #include<mutex> #include<thread> #include<condition_variable> #include <iostream> template <typename T> class SyncQueue{ public: SyncQueue(int maxSize = 10) :maxS

《语义网基础教程》学习笔记(二)

二.RDF概述(参考http://zh.transwiki.org/cn/rdfprimer.htm) 1.本体: 一个本体是一个概念体系(conceptualization)的显式的形式化规范. 一般来说,一个本体形式地刻画一个论域.一个典型的本体由有限个术语及它们之间的关系组成. ★在万维网这个环境中,本体提供了对给定领域的一种共识.这种共识对于消除术语差别是必要的. 通过把各自的术语差异映射到一个公共的本体之间的直接映射,可以消除这些术语差异. 不管采用哪种方案,本体都支持语义可共用性(s

AVOS Cloud 学习笔记(二) 功能总结(What it can do?)

AVOS Cloud 学习笔记(一)   功能总结(What it can do?) 第一章.对象存储 对象新建.保存.更新.删除和检索 1 //创建新对象,根据类名 2 AVObject *gameScore = [AVObject objectWithClassName:@"GameScore"]; 3 [gameScore setObject:[NSNumber numberWithInt:1337] forKey:@"score"]; 4 [gameScor

Android学习笔记(二)--iparty登陆界面

打开应用,判断是否第一次使用. 1 private void beforeInitMenu() { 2 AppContext appContext = (AppContext) getApplicationContext(); 3 4 if (appContext.isFirstLogin()) { 5 // 第一次启动 6 //如果第一次启动,出现5张引导图片. 7 Intent intent = new Intent(this, GuideActivity.class); 8 startAc

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

《lua程序设计(第二版)》学习笔记(二)

直接上代码 1: -- 第2章 类型与值 2: -- 动态类型的语言,每个值都携带自身类型信息 3: print("类型打印,每个值都携带自身类型"); 4: print(type("Hello world")); -- string 完全采用8位编码,字符可以具有任何数值编码,可以将任意二进制数据存储到字符串中 5: --[[ 6: string是不可变值,不能像C一样修改一个字符创中某个字符,而是应该 7: 创建一个新的字符串; 8: 和其他对象一样,都是自动内

【我的Oracle学习笔记(二)】----- select语句补充

一.多表查询 多表查询是指从多个有关联的表中查询数据,其语法与单表查询类似.一般来说,多表查询的表要用连接联系起来,如果没连接,则查询结果是这多个查询表的笛卡尔积(注释1). 模拟查询雇员姓名和所在部门名称: select [雇员姓名],[部门名称] from [雇员表] a,scott,[部门表] b where a.[部门编号]=b.[部门编号]; 上例中,为每一个查询表指定了别名,便于SQL语句的书写. 模拟查询在”sales“部门工作的雇员其雇员姓名 select [雇员姓名] from