/**************************************************************
技术博客
http://www.cnblogs.com/itdef/
 
技术交流群
群号码:324164944
 
欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
**************************************************************/

本节演示使用多线程的代码

由于示例中使用的是pthead函数 为了在windows下运行 我做了点改动

使用c++11 的thread函数

代码如下 与第一节的hwclient 配套使用

// mttest.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "zhelpers.hpp"
#include <thread> void worker_routine(void* arg)
{
zmq::context_t *context = (zmq::context_t *) arg; zmq::socket_t socket(*context, ZMQ_REP);
socket.connect("inproc://workers"); while ()
{
zmq::message_t request;
socket.recv(&request);
std::cout << "Received request: [" << (char*)request.data() << "]" << std::endl; // Do some 'work'
Sleep(); // Send reply back to client
zmq::message_t reply();
memcpy((void *)reply.data(), "World", );
socket.send(reply);
}
return;
} int main()
{
zmq::context_t context();
zmq::socket_t clients(context, ZMQ_ROUTER);
clients.bind("tcp://*:5555");
zmq::socket_t workers(context, ZMQ_DEALER);
workers.bind("inproc://workers"); std::thread t[];
for (int thread_nbr = ; thread_nbr < ; thread_nbr++)
{
t[thread_nbr] = std::thread(worker_routine, (void *)&context);
} zmq::proxy(clients, workers, NULL); for (int thread_nbr = ; thread_nbr < ; thread_nbr++)
{
t[thread_nbr].join();
} return ;
}

// temp.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "zhelpers.hpp"
#include <thread>
void step1(void *arg) { zmq::context_t * context = static_cast<zmq::context_t*>(arg); // Signal downstream to step 2
zmq::socket_t sender(*context, ZMQ_PAIR);
sender.connect("inproc://step2"); s_send(sender, ""); return;
} // Step 2 relays the signal to step 3 void step2(void *arg) { zmq::context_t * context = static_cast<zmq::context_t*>(arg); // Bind to inproc: endpoint, then start upstream thread
zmq::socket_t receiver(*context, ZMQ_PAIR);
receiver.bind("inproc://step2"); std::thread t = std::thread(step1, context); // Wait for signal
s_recv(receiver); // Signal downstream to step 3
zmq::socket_t sender(*context, ZMQ_PAIR);
sender.connect("inproc://step3");
s_send(sender, ""); t.join();
return;
} int main()
{
zmq::context_t context(); // Bind to inproc: endpoint, then start upstream thread
zmq::socket_t receiver(context, ZMQ_PAIR);
receiver.bind("inproc://step3"); std::thread t = std::thread(step2, &context); // Wait for signal
s_recv(receiver); std::cout << "Test successful!" << std::endl; t.join();
return ;
}

zeromq学习记录(五)vc下多线程的更多相关文章

  1. zeromq学习记录(一)最初的简单示例使用ZMQ_REQ ZMQ_REP

    阅读zeromq guide的一些学习记录 zeromq官方例子 在VC下运行会有些跨平台的错误 我这里有做修改 稍后会发布出来 相关的代码与库  http://download.zeromq.org ...

  2. Delphi中,indy控件实现收发邮件的几点学习记录( 可以考虑加入多线程,用多个邮箱做一个邮箱群发器) 转

    关于用Delphi中的Indy控件实现收发邮件的几点学习记录             这几天心里颇不宁静,不是因为项目延期,而是因为自己几个月前做的邮件发送程序至今无任何进展,虽然一向谦虚的人在网上发 ...

  3. zeromq学习记录(六)C语言示例

    考虑到官方的示例c语言是最多的 官方未使用C++语言演示的例子就使用VC编译C语言例子 记录在此 /************************************************** ...

  4. java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

    这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在 ...

  5. 开源框架.netCore DncZeus学习(五)下拉树的实现

    千里之行,始于足下,先从一个小功能研究起,在菜单管理页面有一个下拉树,先研究下它怎么实现的 1.先找到menu.vue页面 惯性思维先搜索请选择三个字,原来是动态生成的 再向上找DropDown组件, ...

  6. 全文搜索引擎ElasticSearch学习记录:mac下安装

    最近开发组培训了ElasticSearch,准备开展新项目,我也去凑了下热闹,下面把学习过程记录一下. 一.安装 1.环境需要jdk1.8; 2.下载:http://www.elastic.co/do ...

  7. Erlang学习记录(一)——Windows下的环境搭建

    一.安装编译器 在http://www.erlang.org/download.html下载R16B01 Windows Binary File并安装. 二.运行编译器 安装完编译器后,打开安装目录下 ...

  8. Ansible学习记录五:PlayBook学习

    0.介绍 Playbooks 是 Ansible 管理配置.部署应用和编排的语言,可以使用 Playbooks 来描述你想在远程主机执行的策略或者执行的一组步骤过程等 类似于一组任务集,定义好像项目, ...

  9. Spring学习记录(五)---bean的作用域scope

    作用域:singleton:单例,整个应用中只创建一个实例(默认) prototype:原型,每次注入时都新建一个实例 session:会话,每个会话创建一个实例 request:请求,每个请求创建一 ...

随机推荐

  1. VUE打包上线优化

    1.将vue vue-router vuex 尽量使用CDN externals: { 'vue':'Vue', 'vue-router':'VueRouter', 'vuex':'Vuex', 'a ...

  2. ubuntu14.04 安装jdk1.8及以上

    安装xmind1.8 碰到jvm版本太低的错误: Version 1.7.0_131 of the JVM is not suitable for this product. Version: 1.8 ...

  3. python导包路径的修改

    1.sys os 模块 import sys import os 2.查看默认的导包路路径: print(sys.path) 3.路径拼接 os.path.join(url, 'apps')) 4.追 ...

  4. linux 时间和时区设置

    在linux中与时间相关的文件有 /etc/localtime /etc/timezone 其中,/etc/localtime是用来描述本机时间,而 /etc/timezone是用来描述本机所属的时区 ...

  5. 1 CRM

    一.crm介绍 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销 ...

  6. 剑指offer例题——二进制中1的个数

    题目:输入一个整数,输出该二进制表示中1的个数.其中负数用补码表示. 首先明确补码的定义: 原码 反码 补码 将最高位作为符号位(0表示正,1表示负), 其它数字位表达数值本身的绝对值的数字表示方式 ...

  7. spring @transactional 注解事务

    1.在spring配置文件中引入<tx:>命名空间 <beans xmlns="http://www.springframework.org/schema/beans&qu ...

  8. git command line 提交代码

    echo "# spring-boot-apollo-demo" >> README.md git init git add README.md git commit ...

  9. Javascript面试题收集

    第一部分“ 来源: http://bbs.miaov.com/forum.php?mod=viewthread&tid=6974 1.var a = b = 1; ——这样定义变量的隐患 fu ...

  10. 计算机系统的通信PPT版本

    通信方式 并行传送:一次8位,需要保持各路信号同时到达,距离和速度受限制,成本较高 串行传送:一次1位,距离较远.速率更高,成本较低. {在单片机的通信中,使用的是串行传送,但是数据寄存器里面的是8位 ...