<Boost> boost::thread 多线程的使用

若依框架-实现管理端与用户端的不同页面布局 我们现在要做的是:管理员登录时展示后台管理端,普通用户登录时展示我们自己写的页面。所以我们可以用v-if来判断登录用户的角色,如果用户角色包含admin,说明是管理员,渲染管理端相关组件,否则渲染用户端组件。不过若依作者的本意还是想退出系统后清空角色信息,所以为了保险期间,我们可以在退出系统后,延迟2秒,再单独清空角色信息。当我们登录管理端后,再退出登录,会有那么一瞬间渲染用户页面,然后才是回到登录界面。这个时候,前端检测到角色信息为空,不包含admin,于是就会渲染用户页面。用来延迟 2 秒执行。 阅读详情

boost::thread参考帮助文档:http://www.boost.org/doc/libs/1_57_0/doc/html/thread.html


1. Windows的多线程

参考博文:http://blog.youkuaiyun.com/morewindows/article/details/7421759

#include <process.h>

CRITICAL_SECTION g_cs;
void WinThread(LPVOID lP)
{
	EnterCriticalSection(&g_cs);		// 使用临界区保证互斥运行:另外还有事件Event, 信号量Semaphone, 互斥锁Mutex等
	string *pstr = (string*)lP;
	cout << "My WinThread: " << *pstr << endl << flush;

	// do somthing
	delete pstr;
	LeaveCriticalSection(&g_cs);
}

unsigned int WINAPI WinThread2(void * lP)	// 需要定义为__stdcall
{
	EnterCriticalSection(&g_cs);
	string *pstr = (string*)lP;
	cout << "My Winthread2: " << *pstr << endl;

	delete pstr;
	LeaveCriticalSection(&g_cs);

	_endthreadex(0);
	return 0;
}

void TestWinThread()
{
	InitializeCriticalSection(&g_cs);
	HANDLE hThread = CreateThread(NULL, 0, 
		(LPTHREAD_START_ROUTINE)WinThread,	// 线程函数
		new string("CreateThread"),			// 函数参数: 需要新开辟内存,或静态、全局变量
		0, NULL);
	
	WaitForSingleObject(hThread, INFINITE);	// 无限期等待线程执行结束
	CloseHandle(hThread);

	uintptr_t pTh = _beginthreadex(NULL, 0, WinThread2, new string("_beginthreadex"), 0, NULL);
	WaitForSingleObject((HANDLE)pTh, 1000); // 等待线程执行完毕,超时时间1秒钟
	cout << "_beginthreadex executed; " << endl;
}

运行结果:



2. boost::thread

boost::thread 的出现解决了函数参数需要静态、全局变量或者开辟新内存的问题。

博文参考:http://blog.youkuaiyun.com/iamnieo/article/details/2908621

看官方帮助文档:

struct callable
{
    void operator()();
};

boost::thread copies_are_safe()
{
    callable x;
    return boost::thread(x);
} // x is destroyed, but the newly-created thread has a copy, so this is OK

boost::thread oops()
{
    callable x;
    return boost::thread(boost::ref(x));
} // x is destroyed, but the newly-created thread still has a reference
  // this leads to undefined behaviour

我们可以:

struct MyCallable
{
	MyCallable(int i) { m_iNo = i;}

	void operator()()
	{
		for (int i = 0; i < 10; i++)
		{
			cout << "[" << m_iNo << "]报数" << i  << endl;
		}
	}

	int m_iNo;
};

void TestThread()
{
	boost::thread t(MyCallable(0));	
	t.join();		// 主线程阻塞至t线程完成
	return;
}

运行结果:



采用函数的形式,这里我们加入多线程互斥锁进行同步,是线程之间不相互影响。

boost::mutex io_mutex;
void BoostThreadFunc(int i)
{
	boost::mutex::scoped_lock sl(io_mutex);	 // sl构造函数,调用io_mutex.lock()
	MyCallable mc(i);
	mc();

	// sl析构函数, 调用io_mutext.unlock()
}

void TestThread()
{

	boost::thread t1(BoostThreadFunc, 1);
	boost::thread t2(BoostThreadFunc, 2);
#if 1
        t1.join();
        t2.join();
#else
	boost::thread::native_handle_type handles[2];
	handles[0] = t1.native_handle();
	handles[1] = t2.native_handle();

	WaitForMultipleObjects(2, handles, TRUE, INFINITE);		// 等待t1,t2线程都执行结束

	t1.detach();
	t2.detach();
#endif
}


运行结果:


如果不加锁的话,执行的结果的不可预见的。

也支持多个参数:

class MyThreadPara
{
public:
	MyThreadPara(string str) : m_strInfo(str) { }
	
	void Print() {
		cout << m_strInfo << endl;
	}
private:
	string m_strInfo;
};

void BoostThreadClassParaFunc(int i, MyThreadPara para1, MyThreadPara para2) // 最多9个
{
	boost::mutex::scoped_lock sl(io_mutex);	 // sl构造函数,调用io_mutex.lock()
	cout << "[" << i << "]" << endl;
	para1.Print();
	para2.Print();
	// sl析构函数, 调用io_mutext.unlock()
}

void TestThread()
{
	boost::thread t3(BoostThreadClassParaFunc, 3, MyThreadPara(string("FirstClassPara")), MyThreadPara(string("SecondClassPara")));
	t3.join();
}
执行结果:


出现Command ‘vim‘ is available in the following places,vim: command not found等解决方法 内置命令无法识别,说明系统变量有误,导致无法识别,既然系统变量有误,将其注释或者更改为正确的即可,但是现在打不开,又怎么注释掉。替换vim来打开编辑,打开之前错误的全局变量文件,发现变量有误,要么注释要么改为。系统变量有全局变量(通过命令行printenv或者echo)和局部变量。对应通过vim修改错误的变量文件,不然source也无法让配置文件生效。本身vim是系统内置的命令,连vim都出现问题。修改为正确的即可,之后还需要重启服务器,使用。之后即可成功,通过即可查看命令是否有写入。... 阅读详情

相关推荐

ComfyUI中一个超好用的变量管理类节点-KJNodes

在AI绘图中,ComfyUI的热度开始慢慢起来一些,但是这个软件在使用的过程中,需要很多连线,仅仅一个最简单的动画生成,就需要连接这么多线条,而且有些线会飞的很远,看起来就很不美观,尤其是一些复杂工作流,连接到最后自己可能已经分不太清楚到底连接好了没有。今天在研究C站的大佬们的工作流的时候,发现一个有意思的工作流,看起来大概是这种感觉:干净整洁。他用到了KJNodes这么个节点来管理变量,git上星标也不算很多,所以我想很多朋友可能还不知道,所以这里简单介绍下用法。

聚梦小课堂 7520

boost 线程 linux,Boost Linux线程第一课

#include #include void ThreadFunc(){std::cout<}int main(){boost::thread thrd1(&ThreadFunc);thrd1.join();return 0;}编译指令g++ test.cpp -lboost_thread注意:没有链接boost_thread,出错提示如下:undefined refer...

weixin_35742845的博客 346

文华财经公式编程:麦语言简介及基础语法

文华财经公式语言(麦语言)是一种专门用于金融领域的编程语言,它是由文华财经公司开发的。提供了丰富的金融计算函数和数据处理功能,可以用于金融市场的数据分析、模型建立和交易策略的开发。例1:A:CLOSE;// 定义变量A为收盘价(盘中k线没有走完的时候A为最新价)。例2:MA5:=MA(C,5);// 定义收盘价的5周期均线(C为CLOSE简写)。例3:A:=REF(C,1);// 取得前一根k线的收盘价。

超哥量化的博客 1万+

C++11 thread::native_handle(6)

原文地址:http://www.cplusplus.com/reference/thread/thread/native_handle/ public member function std::thread::native_handle native_handle_type native_handle(); Get native handle This mem

roaylchen的博客 1万+

Win10环境下VS2019离线部署OnnxRuntime的完整指南

本文提供了在Windows 10系统下,为Visual Studio 2019进行OnnxRuntime离线部署的完整教程。针对网络受限环境,详细讲解了如何获取正确的离线安装包、配置本地NuGet源,并逐步指导项目配置与测试,确保AI模型在C++环境中顺利运行。

weixin_29205061的博客 400

Flowable高级篇 -6.8.0 最全表结构说明-主要表结构字段注释

flowable 28张表 详细

billzhen的博客 1万+

85 C++的native_handle

为了弥补C++11线程库的不足,thread类提供了native_handle()成员函数,用于获得与操作系统相关的原生线程句柄,操作系统原生的线程库就可以用原生线程句柄操作线程。C++11定义了线程标准,不同的平台和编译器在实现的时候,本质上都是对操作系统的线程库进行封装,会损失一部分功能。

wade1010的专栏 809

【点云语义分割】Ubuntu20.04下RangeNet++环境配置与实战指南

本文详细介绍了在Ubuntu20.04系统下配置和运行RangeNet++点云语义分割模型的完整实战指南。内容涵盖从Cuda、cudnn到TensorRT的深度学习环境搭建,RangeNet++源码编译的详细步骤与常见问题解决,以及如何运行首个分割Demo并可视化结果。最后,还探讨了处理自定义点云数据格式和进行性能调优的进阶技巧,旨在帮助开发者和研究者快速部署并应用这一先进的点云语义分割技术。

rnn9storyteller的博客 516

两种 C++ 多线程编程方式,看完不懂打我...

多线程在实际编程中的重要性不言而喻,对 C++ 而言,当我们需要使用多线程时,有多种方案可供选择。比如 POSIX 线程 pthread、boost::thread 库、C++11 开始支持的 std::thread 库,以及其他一些第三方库 libdispatch(GCD)和 OpenMP 等等。 至于选择哪种多线程编程方案,需要根据你的实际项目、运行平台、团队协作等因素来考虑。一般而言,如果使用的是 Linux 操作系统,那么可以直接使用系统提供的 pthread 库编写多线程 C++ 程序;如果需要跨

程序员「阿基米东」的编程之旅 2万+

华为OD机试真题 - 矩阵匹配 牛客网

2024华为OD机试真题,代码包含语言java、js、python、c 代码基本都有详细注释。 题目描述 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式: N M K N*M矩阵 输出描述 N*M 的矩阵中可以选出 M! / N! 种组合数组,每个组合数组种第 K 大的数中的最小值。无需考虑重复数字,直接取字典排序结果即可。

2301_76543445的博客 498

环境配置与基础教程:2026大厂标准:使用 DVC (Data Version Control) 实现 YOLO 数据集版本控制全链路管理

本文介绍了使用DVC 3.0对YOLO数据集进行全链路版本控制的方法。主要内容包括: DVC 3.0的核心增强:内容块级缓存去重、并行云传输、AI智能体元数据跟踪等新特性,可显著提升YOLO数据集管理效率。 环境配置:详细说明DVC 3.0的安装步骤、项目初始化方法以及远程存储配置方案(支持S3、GCS、Azure等多种存储后端)。 目录结构规范:提供符合大厂MLOps标准的项目目录结构设计。 实战操作: 原始数据版本化 多格式标注数据版本控制 版本切换方法 优势说明:DVC通过哈希指针机制管理大型数据集,

ZXSXJ的博客 148

androidstudio编译boost线程库报错 undefined reference to boost::thread incompatible target

AndroidStudio编译boost::thread报错 报错信息 boost_1_72_0/android_build/lib/libboost_thread-clang-mt-1_72.a(thread.o): incompatible target boost/thread/detail/thread.hpp:716: error: undefined reference to ‘boost::thread::native_handle()’ 分析解决办法: incompatible target

mowwwcom的专栏 854

C2000ware介绍

C2000的下载安装指南C2000目录。

小柚子的博客 2796

boost/config.hpp文件详解

简要概述 今天突发奇想想看一下boost/config.hpp的内部实现,以及他有哪些功能。 这个头文件都有一个类似的结构,先包含一个头文件,假设为头文件1,然后包含这个头文 件中定义的宏。对于头文件中1中,有大量的#if..#endif,在这些指定的宏块中定义一个头文件宏,在这些大量的#if...#end中,头文件宏 有且只会被定义一次。具体的定义详情...

weixin_34378045的博客 984

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

BOOST 库 thread类线程使用 [大三四八九月实习]

thread库为C++增加了线程处理能力,它提供简明清晰的线程、互斥量等概念,可以容易地创建多线程应用程序。thread库也是高度可移植的,它支持使用最广泛的windows和POSIX[Unix下应用程序共同遵循的一种规范 ]线程,用它编写的代码不需要修改就可以在windows、unix等操作系统之上编译运行。   使用thread库[ vs2010 ]   1.包含thread头

记一忘三二 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

BOOST多线程

1,使用全局函数作为线程执行体 void Func(int nCount) { for (int i = 0; i < nCount; i++) { cout << __FUNCTION__ << i << endl; } } int _tmain(int argc, _TCHAR* argv[]) { boost::thread t

lusic01的专栏 572

boost多线程

i < 5;新建线程里执行的那个函数的名称被传递到 boost::thread 的构造函数。一旦上述示例中的变量 t 被创建,该 thread() 函数就在其所在线程中被立即执行。同时在 main() 里也并发地执行该 thread()。为了防止程序终止,就需要对新建线程调用 join() 方法。join() 方法是一个阻塞调用:它可以暂停当前线程,直到调用 join() 的线程运行结束。

weixin_50577176的博客 518

4.7 C++ Boost 多线程并发库

C++语言并没有对多线程与网络的良好支持,虽然新的C++标准加入了基本的`thread`库,但是对于并发编程的支持仍然很基础,Boost库提供了数个用于实现高并发与网络相关的开发库这让我们在开发跨平台并发网络应用时能够像Java等语言一样高效开发。 thread库为C++增加了多线程处理能力,其主要提供了清晰的,互斥量,线程,条件变量等,可以很容易的实现多线程应用开发,而且该库是可跨平台的,并且支持`POSIX`和`Windows`线程。

微软技术分享 6360

【C++】创建多线程的方法总结:【std】、【boost】、【pthread】、【window线程库】。

下个迭代有个任务很有趣,用大量的线程去访问一个借口,直至其崩溃为止,这就需要多线程的知识,这也不是什么难事,总结一下C++中的多线程方法:std、boost、pthread、windows api。

Bobowen的博客 3210

boost::thread的六种使用方法总结

boost::thread有两个构造函数: (1)thread():构造一个表示当前执行线程的线程对象; (2)explicit thread(const boost::function0&lt;void&gt;&amp; threadfunc):      boost::function0&lt;void&gt;可以简单看为:一个无返回(返回void),无参数的函数。这里的函数也可以是类重载op...

jack_20的博客 3万+

C++使用Boost多线程

首先从这里下载boost的windows库: https://www.boost.org/users/download/ 解压运行bootstrap.bat 生成b2.exe之后运行b2.exe编译库 之后新建项目,在工程属性-&amp;gt;配置属性-&amp;gt;VC++目录-&amp;gt;包含目录中添加解压的目录路径 在工程属性-&amp;gt;配置属性-&amp;gt;链接器-&amp;gt;常规-&amp;gt;附加库目录中添加编译生成的

神棍之路 1399

Boost(六)——多线程

结合Boost官网 多线程的难点在于同步执行,需要“锁”控制所有权。 锁有分:互斥锁,条件变量... 互斥锁:boost::mutex 获取和释放成对存在,也可以用boost::lock_guard&lt;boost::mutex&gt; lock(mutex); boost::lock_guard在其内部构造和析构函数分别自动调用 lock() 和 unlock() 类似于智能指针。 ...

coco的博客 529

BOOST 线程完全攻略

BOOST 线程完全攻略 - 基础篇 jackyhwei 发布于 2010-11-01 09:26 来自:优快云博客 boost标准stl库的出现,让我眼前一亮,boost所推行的简洁代码概念和模板概念,让我有了清风扑面的感觉,本文将介绍如何使用boost::thread来取代不太安全的MFC线程编程。 TAG: boost  多线程

痞子龙3D编程 2159

Windows下Boost库源码编译安装及CMake配置实战指南

探索Boost库在Windows上的源码安装与CMake集成技巧,从下载编译到环境配置,再到CMake实战案例,全方位提速C++开发环境设置。

m0_51661400的博客 1万+

多线程-----共享互斥量

就像之前我们提过的一样,很多线程需要互斥量进行相互锁定,因为很多关键数据和操作并不是线程安全,多线程处理很有可能会出很大的问题。但是互斥量又会带来一个问题,我就举个例子来说明: 比如说,现在有一组数据,可以对它进行读写操作。但是一般情况读写要分开操作,因为这样才可以让后续处理更好的执行。很明显的道理,这里读写不能同时进行,要设立互斥量。多线程同时写入也是不允许的,所以要设立互斥量。但是多线程读却

zuoshengting的博客 396

修改BOOST(一)

 修改BOOST(一)     boost是个不错的库。可是也不算太成熟。例如,boost的处理TLS是通过boost_threadmon.dll,使用了TLS的代码必须带一个动态链接库;其次库也不能自动安装,也不能根据你的程序选择了什么样的链接方式(如MT,MD)选择库,如果每次编写一个小型的测试程序都要设置很多东西,恐怕太费力气了;第三,缺乏一些常用的功能,如事件,读写锁等。今天我

kary的专栏 2298

Boost教程之多线程库Boost.Thread

多线程编程就是,在同一程序同一时间内允许执行不同函数的离散处理队列。 这使得一个长时间去进行某种特殊运算的函数在执行时不阻碍其他的函数变得十分重要。 一旦一个应用程序启动,它仅包含一个默认线程。 此线程执行 main() 函数。 在 main()中被调用的函数则按这个线程的上下文顺序地执行。 这样的程序称为单线程程序。 反之,那些创建新的线程的程序就是多线程程序。 他们不仅可以在同一时间执行多...

王木木 4252
上一篇: <Linux> grep文件搜索
下一篇: <Win32> VS新建DLL工程
_Lulixue_
博客等级 码龄16年 45粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值