windows平台下编译zThread库

zthread线程库 zthread线程库提供了各种线程、线程池、队列、各种锁的支持,还能跨平台哦。 立即下载

      今天看到《c++编程思想》中并发一章,作者使用zThread这个开源库来讲解,于是我也下了个版本编译,并简单使用了下,以下是具体步骤:

 一、创建工程

      1.下载源码

       由于官网http://zthread.sourceforge.net一直上不去,所以我从http://download.chinaunix.net/download.php?id=24079&ResourceID=12264下载了ZThread-2.3.1版本压缩包。解压后,只需关注include和src目录下的代码,src中还有好多平台相关的代码,放在各在平台名称命名的目录下,如linux、macos、solaris、win9x、win32。

      2.创建工程

      打开vs2010,创建一个windows console的空项目命名为zthread,工程目录中就产生一个D:\My Documents\Visual Studio 2010\Projects\zthread文件夹,接下去就是把需要的文件或目录拷贝到该目录下

      3.将解压包中相关代码拷贝到zthread的工程目录下,注意不要破环原先的目录结构

      首先只需拷贝include中文件,该目录中有库需要的头文件,include中只有一个zthread文件夹,所以将整个文件夹拷贝到工程目录 中,拷贝完成后在vs解决方案资源管理器中的头文件目录下新建一个删选器命名为zthread(删选器是一个逻辑目录,不会在磁盘中产生相应目录),这是为了使逻辑目录与磁盘中目录结构保持一致,便于代码管理,然后将刚才拷贝的目录中的所有头文件添加到该删选器下。

      接下来的步骤类似,还需拷贝src目录下的所有文件(不包含文件夹)和win32文件夹到工程目录下,然后添加拷贝的文件到工程中,如果文件在win32文件夹中,需要在vs中创建响应删选器再添加文件。

       4.创建一个cpp文件,写一个简单main函数。然后开始编译。

 

二、解决编译问题

       编译过程中大概会出现几类错误:

       1.打不开包含的文件

            (1).如果需要的文件未添加工程,则按步骤3方式添加,之后根据编译错误还添加了posix和vanilla两个目录到工程中

            (2).如果文件已经添加到了工程中,则查看include的相对路径是否正确

       2.无法打开pthread.h

              这个文件是posix thread中的,不在zthread包中,所以需要下载,下载路径 ftp://sourceware.org/pub/pthreads-win32/dll-latest,只需下载windows平台下的lib、dll和三个头文件,头文件分别是pthread.h, sched.h, semaphore.h,下载之后在工程目录下创建bin和lib目录,分别存放dll和lib,把3个头文件直接拷贝到工程目录下

       3.程序中对pthread_t结构体使用错误

               pthread_t结构体定义

                typedef struct {
                       void * p;                   /* Pointer to actual object */
                       unsigned int x;             /* Extra information - reuse count etc */
               } ptw32_handle_t;

            typedef ptw32_handle_t pthread_t;

 程序中有几处直接对该类型对象用0初始化或者和0进行==和!=的比较,所以要稍加修改,为了不修改pthread.h 中该结构体的定义,所以自己要写个额外的类

#pragma once
#include "pthread.h"

class ThreadId
{
public:
ThreadId(const pthread_t& tid)
: tid(tid)
{

}

bool operator==(const pthread_t& tidr)const
{
return tid.p == tidr.p && tid.x == tidr.x;
}

bool operator!=(const pthread_t& tidr)const
{
return !(operator==(tidr));
}

const static pthread_t UNINIT_THREAD_ID;
private:
const pthread_t& tid;
};

const pthread_t ThreadId::UNINIT_THREAD_ID = {NULL, 0};
//使用时将ops->_tid == 0改为ThreadId(ops->_tid) == ThreadId::UNINIT_THREAD_ID
//用ThreadId::UNINIT_THREAD_ID来初始化pthread_t类型对象

 

          4.链接错误

           (1).移除 AtomicCount类的两个实现文件,一个在工程目录下,一个咋win32目录下

            因为工程目录下的AtomicCount.cxx代码如下,与平台相关的条件编译在下载的源码中已经被注释,直接包含了#  include "vanilla/SimpleAtomicCount.cxx",所以AtomicCount的实现文件只留vanilla目录下的SimpleAtomicCount.cxx,其他两个都移除,还有一个在win32目录下,该目录下的实现文件不全,没有实现++,--的前置和后置操作符

#ifndef __ZTATOMICCOUNTSELECT_H__
#define __ZTATOMICCOUNTSELECT_H__

#include "zthread/AtomicCount.h"
#include "zthread/Config.h"

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif


//// Select the correct AtomicCount implementation based on
//// what the compilation environment has defined
//
//#if defined(HAVE_ATOMIC_LINUX)
//#  include "linux/AtomicCount.cxx"
//#elif defined(ZT_WIN32)
//#  include "win32/AtomicCount.cxx"
//#elif defined(ZT_WIN9X)
//#  include "win9x/AtomicCount.cxx"
//#endif
//
//// Default to an AtomicCount that just uses a FastLock
//#ifndef __ZTATOMICCOUNTIMPL_H__
//#  include "vanilla/SimpleAtomicCount.cxx"
//#endif


#  include "vanilla/SimpleAtomicCount.cxx"

#endif // __ZTATOMICCOUNTSELECT_H__


             (2).错误2中下载的lib没有在工程属性中指定

               需要指定lib路径,并在链接输入相中添加lib名称

       

 

三、简单测试

以上问题解决后基本可以通过编译,编译完成后还需要将错误2中保存在bin目录下的dll拷贝到exe的目录下,程序才能运行。

程序成功运行后可在main函数中加入测试代码,先写个测试类LiftOff

#pragma once
#include <iostream>
#include "zthread/Runnable.h"

class LiftOff : public ZThread::Runnable
{
public:
	LiftOff(int nCountDown, int nId = 0)
		: m_nCountDown(nCountDown)
		, m_nId(nId)
	{

	}

	~LiftOff()
	{
		std::cout<<m_nId<<" completed\n";
	}

	virtual void run()
	{
		while(m_nCountDown--)
		{
			std::cout<<m_nId<<":"<<m_nCountDown<<std::endl;
			//Thread::yield();
		}
		std::cout<<"liftoff\n";
	}

private:
	int m_nCountDown;
	int m_nId;
};


在main函数中测试

#include "LiftOff.h"
#include "zthread/Thread.h"
using namespace ZThread;
int main()
{
	try
	{
		Thread t(new LiftOff(10));
		std::cout<<"wait\n";
	}
	catch (Synchronization_Exception& e)
	{
		std::cout<<e.what()<<std::endl;
	}

	Thread::sleep(5000);
	return 0;
}


 


 新增:在vs2010中编译通过的zthread lib工程已上传

 引申:在linux中使用zthread库发生编译错误,错误如下:


/home/scx/workspace/FsMonitor/Common/Thread/zthread/Guard.h:494:20: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
make: *** [Common/Thread/zthread/vanilla/SimpleAtomicCount.o] Error 1


  其中有个模板继承的概念,错误原因解释:http://blog.youkuaiyun.com/ddl007/article/details/6059580,可以通过设置-fpermissive选项来解决。

 

zthread2.3.2 代码和lib zthread2.3.2 代码 lib zthread2.3.2 代码 lib 立即下载

相关推荐

ZThread源文件及Window下编译生成的文件

ZThread的最新源文件及自己编译生成的静态库文件,动态库文件,可以直接用来进行C++的并发编程,也可以自己编译,Windows及Linux的编译方法见http://blog.youkuaiyun.com/lanbing510/article/details/8441258

zthread库类型总结 .

Runnable            //执行任务的接口     Cancelable          //可取消任务接口     Waitable            //任务可阻塞等待接口     Thread              //线程类     ThreadedExecutor    //线程执行器,为每个Runnable任务创建一个线程     PoolExe

516

ZThread 静态库

ZThread是开源的多线程库,这里提供了已经编译好的静态库。

IBM的ZThread库

下载地址去除调试信息:在Debug.h中的最前端增加#define ZTDEBUG(x),忽略警告,DONE这个库用起来应该比Linux系统下提供的并发的借口要来的舒坦,不知道有没有TBB快速,但是可以肯定的是为程序员省掉了很多代码的编辑工作。Mark一下,认真学习之。当需要使用多线程库的时候,需要从Runnable共有继承产生一个类,然后重新定义run()函数代码如下:#include #include "zthread/Runnable.h" #include "zthread/Thread.h"

hitrose27的专栏 3222

别再死磕V1了!手把手教你用WPS Web Office V3 SDK快速集成(附Java Demo避坑指南)

本文详细介绍了如何从WPS Web Office V1迁移到V3版本,重点讲解了V3在性能、安全性和扩展性上的优势,以及Java开发者如何快速集成V3 SDK。文章包含核心功能实现、高级功能适配(如Solon框架)和常见问题排查指南,帮助开发者高效完成迁移并避免常见陷阱。

weixin_27215337的博客 335

ThinkBook 16p 2024 BIOS降压定频实战:从解锁CFG Lock到AC Loadline调优

高性能笔记本在满载时频繁撞上温度墙,通常源于固件层默认电压冗余过大,而系统级降压工具又受限于CFG Lock锁定。要根治问题,需要从BIOS固件层面理解电压管理机制——AC/DC Loadline参数控制着CPU在不同负载下的电压请求,通过修改这些负载线值可以安全降低电压,解锁CFG Lock后还能让XTU、ThrottleStop等软件调参工具恢复可用。这种BIOS级调优在工程实践中广泛用于改善散热、稳定频率、压降风扇噪音,尤其适用于联想ThinkBook 16p 2024与拯救者Y9000P等采用HX平

weixin_32496547的博客 387

zthread的简单使用

#include "stdafx.h" #include #include "zthread/PoolExecutor.h" #include "zthread/ThreadedExecutor.h" #include "zthread/ConcurrentExecutor.h" #include "zthread/SynchronousExecutor.h" #include "z

c1s2d3n4cs的博客 315

扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)

扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码) 文章目录扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)理论讲解KF和EKF模型对比雅可比矩阵计算计算实例应用实例线性模型CV模型:CA模型非线性模型CTRV模型:CTRV实例(python)small demo抛物线demo飞机高度demoC++实例参考文献 我们上篇提到的卡尔曼滤波是用于线性系统,预测(运动)模型和观测模型是在假设高斯和线性情况下进行的。简单的卡尔曼滤波必须应用在符合高斯分布

O_MMMM_O的博客 10万+

zthread学习 实例四 让步、休眠、优先级

1、让步 Thread::yield()可以介入CPU的调度,使CPU强制放弃执行当前线程。   2、休眠 Thread:sleep()可以使线程停止执行一段时间。 Thread:sleep()可发抛出一个Interrupted_Exception,该异常必须在run()函数中捕获,因为异常是不会跨线程传播的,只能在线程内部处理。   3、优先级 T

fengliping的专栏 671

基于三轴加速度计的塑料水管泄漏振动检测技术全解析

在流体力学与结构动力学领域,管道振动分析是评估系统健康状态的关键技术。其基本原理在于,当管道内流体状态发生异常(如泄漏)时,会引发管壁产生特定的机械振动信号。这项技术的核心价值在于实现了对管道系统的非侵入式、在线监测,能够提前预警潜在故障,避免资源浪费与次生灾害。在智慧城市与智能水务等应用场景中,它对于保障供水管网安全、提升运维效率具有重要意义。本文聚焦于如何利用高精度的三轴加速度计,精准捕捉塑料水管因泄漏产生的微弱振动,并通过信号处理与机器学习算法,构建一套从数据采集到泄漏识别与定位的完整工程解决方案。

weixin_32239523的博客 407

pytorch gpu运行安装重点(CUDA12.3)

pytorch gpu加速

weixin_45597212的博客 3万+

跨平台线程库 ZThread入门

 由于要用到多线程技术,之前用过windows API,但那是windows平台的。想试一下跨平台的,网上说boost有线程库,但那是个庞然大物,编译麻烦。无意中看见Zthread,这个小巧玲珑, sourceforge就有源码下载。第一次运行就成功了,好神奇啊! 小例子:   #include &lt;iostream&gt; #include &lt;zthread/Runnable....

westice的专栏 530

盘点天才少年稚晖君彭志辉的知识体系

一个杰出工程师的工作区间和装备

曲折旅程,艰难人生 2万+

ZThread在Windows下打印若干DEBUG信息到console的原因

代码见这篇随笔 在Windows下的运行结果:ZThread打印了一堆东西(并不是我写的) 文件结构: 最开始我以为是编译选项没弄对,同样的代码放到Linux下编译,还是打印这些信息   注意我在Linux下编译的时候用的是如下命令: g++ -c *.cpp g++ -o main.o LiftOff.o -s zthread_linux.a -lpthread ...

weixin_33713707的博客 113

MTK-AWB 小结 (二)

调试总结:可以将offset 对应的ratio加大,保留更多的喜好色(偏色),影响WF statistic gain,从而影响最终的awb gain。这一部分前期CCT校准的时候就会算出一组默认值,当然这个offset offse 值用于优化T,S,wf 光下的偏色喜好度. offset。后面遇到 A H Shad 光收白或者偏色,还可以优化 A 的offset ,H offset,shad offset.new offset 计算过程(Day locus offset 和M/G offset )

qq_46056347的博客 1167

1.为什么要学习SIMULINK

用户也可以自定义和创建自己的模块,利用这些模块,用户可以创建层次化的系统模型,可以自上而下或自下而上地阅读模型,也就是说,用户可以查看最顶层的系统,然后通过双击模块进入下层的子系统查看模型,这不仅方便了工程人员的设计,而且可以使自己的模型方块图功能更清晰,结构更合理。此外,利用示波器模块或其他的显示模块,用户可以在仿真运行的同时观察仿真结果,而且还可以在仿真运行期间改变仿真参数,并同时观察改变后的仿真结果,最后的结果数据也可以输出到MATLAB工作区进行后续处理,或利用命令在图形窗口中绘制仿真曲线。

FPGA/MATLAB学习教程/源码/项目合作开发 1546

ZThread库的配置,Windows&Linux

ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序。 ZThread库的主页:http://zthread.sourceforge.net 最新版本Zthread远吗下载地址:http://go.rritw.com/prdownloads.sourceforge.net/zthread/ZThr

求知若饥,知行合一 1807

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

在Windows下使用nmake+Makefile+编译ZThread库(附例子)

  ----------2015/01/09/23:21更新----------------------------------- 关于保留DEBUG信息的一个简单例子,见这篇随笔 ----------2014/12/18/17:53更新----------------------------------- 前段时间写了这篇随笔,现在回过头来看感觉有很多问题,因此打算修正和补充一下,以前写...

weixin_33941350的博客 523

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

在Window和Linux下使用Zthread库

ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序。 ZThread库的主页:http://zthread.sourceforge.net 最新版本Zthread远吗下载地址:http://prdownloads.sourceforge.net/zthread/ZThread-2.3.2.tar.gz ...

SurpassLi的专栏 58

ZThread库试用小记

  昨天刚down了个ZThread,这个库主要用来开发c++的多线程应用。  那么我写的demo是使用windows平台下的dev-c++来做的,如果你用dev-c++,那么首先有1个问题要解决:http://blog.youkuaiyun.com/jimmy_w/archive/2007/12/24/1965313.aspx这里有解释为什么模板化基类里的名称不能被查到,以及怎么解决。编译好之后,在项目中可

Jimmy's Blog 1345

windows下编译ZThread-2.3.2

到网上下载ZThread-2.3.2 用VS2008编译静态库,新建win32静态库工程CompileZThread, 设置头文件路径../ZThread-2.3.2\include 将src文件夹中的文件(子文件夹不要添加)拷贝到CompileZThread工程文件夹中,并添加到工程中 将src文件夹里的子文件夹vanilla、solaris、win32里的文件也

jjdujiang的专栏 1330

在Window和Linux下使用ZThread库

C++编程思想 第2卷 第11章 也就是最后一章 如果没有弄Zthread库的话 那一章的代码都是运行不了的 开始焦头烂额 缺什么文件就导入什么文件 之后还是错误 牵一发而动全身 不是仅仅需要几个头文件 和cpp文件就能搞定的 几乎用到了所有的代码  累了睡,睡了起来,想找一下有没有简单的方法 百度搜了下 看了这篇 受益匪浅 我用了那个不推荐的方法 最后代码成功了  原贴地址:http...

eyetired的博客 431
上一篇: 如何计算结构体大小和结构体中成员的内存偏移
下一篇: 实现简单计数指针
sunchenxian017
博客等级 码龄16年 2粉丝 13原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值