zeromq学习记录(五)vc下多线程

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

由于示例中使用的是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 (1)
    {
        zmq::message_t request;
        socket.recv(&request);
        std::cout << "Received request: [" << (char*)request.data() << "]" << std::endl;

        //  Do some ‘work‘
        Sleep(1);

        //  Send reply back to client
        zmq::message_t reply(6);
        memcpy((void *)reply.data(), "World", 6);
        socket.send(reply);
    }
    return;
}

int main()
{
    zmq::context_t context(1);
    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[5];
    for (int thread_nbr = 0; thread_nbr < 1; thread_nbr++)
    {
        t[thread_nbr] = std::thread(worker_routine, (void *)&context);
    }

    zmq::proxy(clients, workers, NULL);

    for (int thread_nbr = 0; thread_nbr < 1; thread_nbr++)
    {
        t[thread_nbr].join();
    }

    return 0;
}

// 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(1);

    //  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 0;
}

时间: 2024-10-08 09:47:49

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

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

这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码 那么我们要思考的地方有:1.知道我们写的哪些是多线程代码 2.明确共享数据 3.明确多线程运行的代码中哪些语句是操作共享数据的.. 4.要确保使用同一个锁. 下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完. class bank{ private int

Oracle学习记录 五 Centos6.4 64bit下安装oracle

错误记录: Invalid source path '../stage/Components/oracle.jdk/1.5.0.17.0/1/DataFiles' specified for unzip. 这个错误应该是我只解压了第一个压缩包,没有解压第二个. 2. 还有一个问题就是按照开始安装的时候,说什么color的问题,这个我在网上看了些,不过,我直接把系统登出一次,重新用oracle登录就没事了. 3. [INS-32021] Insufficient disk space on thi

Ansible学习记录五:PlayBook学习

0.介绍 Playbooks 是 Ansible 管理配置.部署应用和编排的语言,可以使用 Playbooks 来描述你想在远程主机执行的策略或者执行的一组步骤过程等 类似于一组任务集,定义好像项目,组织结构,配置文件等信息,通过task将所要做的事情一步一步的组织在一起就是完整的Playbook 官方Demo资料:https://github.com/ansible/ansible-examples Playbooks是采用YMAL语言结构,基础语法请参考:http://docs.ansibl

产品需求文档的学习记录(五)

在产品和技术领域里都有UML的技能知识,而对于产品人员的UML则更多的是指用例图,也就是我所称呼的用户流程图.在讲PRD文档写作的第二篇文章里,我提到了用户流程图的制作,实际上用户流程图是我在产品规则的初期对用例图的一种结构化的表达方式,由于以结构化的方式描述用例太抽象,缺少逻辑性表达,并且那篇文章更偏向于功能性用户流程,还不是实际意义上的用例,因此今天我补文一篇,细讲一下UML用例图和用例文档. 用例文档是由多个用例组成的一份文档,主要用于技术开发与测试使用,他是PRD中的重要辅助文档,用于讲

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

考虑到官方的示例c语言是最多的 后面可能有些例子就使用VC编译C语言例子 /************************************************************** 技术博客 http://www.cnblogs.com/itdef/ 技术交流群 群号码:324164944 欢迎c c++ windows驱动爱好者 服务器程序员沟通交流 **************************************************************

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

最近开发组培训了ElasticSearch,准备开展新项目,我也去凑了下热闹,下面把学习过程记录一下. 一.安装 1.环境需要jdk1.8; 2.下载:http://www.elastic.co/downloads/elasticsearch 3.下载完成后在端终解压,解压命令:tar -vxf elasticsearch-6.2.4.tar 二.启动elasticSearch 进入文件夹:cd elasticsearch-6.2.4 启动命令:sh ./bin/elasticsearch 如下

学习Pushlet(五):pushlet多线程实现

使用多线程的时候,就需要我们前面看的源码怎么发送请求,和后台的serlet的代码,因为需要自己重新手写实现我们的需求. 首先整体思路是发送一个请求到我们自己的serlet,然后不同的用户订阅不同的事件(userId),然后每个线程管理自己的事件和session,当浏览器关闭刷新的时候取消订阅,然后关闭线程,但是取消订阅的时候session是不会立刻关闭的,有一个默认事件一分钟自己关闭,如果想要关闭session的话,需要用id,所以我自己传递了sessionid,以便于我关闭. jsp中的方法(

Linux 学习记录 五(软件的安装升级)

一.gcc gcc是Linux上面最标准的C语言的编译程序,用来源代码的编译链接. gcc -c hello.c 编译产生目标文件hello.o gcc -O hello.c 编译产生目标文件,并进行优化 gcc -o hello hello.c 生成hello这个可执行的二进制文件 缺点:命令的冗余性,如果 C 语言程序中包含对其他函数或者程序的引用,那么其他程序也要编译成目标文件,然后一起编译成可执行文件,才能运行成功.一个大的程序引用是非常多的,所以用gcc来编译,显得很冗余. 二.mak

zeromq学习笔记1——centos下安装 zeromq-4.1.2

1.前言 MQ(message queue)是消息队列的简称,可在多个线程.内核和主机盒之间弹性伸缩.ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”.现在还未看到它们的成功.但是,它无疑是极具前景的.并且是人们更加需要的“传统”BSD套接字之上的一 层封装.ZMQ让编写高性能网络应用程序极为简单和有趣. 2.安装过程 (1)下载最新的ZeroMQ:http://download.zeromq.org/ (2)解压:tar -xvf zeromq-4.1.2.tar.gz