ZMQ PULL/PUSH exercise

/********************************************************************************************
		  push
		     |
	             |
	_____________|______________
	|            |              |
	|            |              |
	|            |              | 
	pull/push   pull/push     pull/push
	|	     |              |
	|            |              |
	|____________|_____________ |
	             |
		     |
	             |
       		  pull
	
	
********************************************************************************************/

#include <zmq.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;

void* joined_thread(void* ctx)
{
	void* pull = zmq_socket(ctx, ZMQ_PULL);
	zmq_bind(pull, "inproc://joined");

	long sum = 0x00;
	long index = 0x00;
	while (1)
	{
		zmq_msg_t msg;
		zmq_msg_init(&msg);
		zmq_recv(pull, &msg, 0);
		printf("\t\trecv*****************%s\n", (char *)zmq_msg_data(&msg));
		sum += atoi((char*)zmq_msg_data(&msg));
		zmq_msg_close(&msg);
		if(index++ %3 == 0x00)
			std::cout<<"sum is="<<sum<<std::endl;	
		
	}
	return 0x00;
}

void * worker_thread(void *ctx)
{
	pthread_t pid  = pthread_self();
	void* pull = zmq_socket(ctx, ZMQ_PULL);
	void* push = zmq_socket(ctx, ZMQ_PUSH);
	zmq_connect(pull, "inproc://pusher");
	zmq_connect(push,"inproc://joined");
	while (1)
	{

		zmq_msg_t msg;
		zmq_msg_init(&msg);
		zmq_recv(pull, &msg, 0);
		printf("recv: %s==pid=%p\n", (char *)zmq_msg_data(&msg),pid);
		zmq_send(push,&msg,0x00);
		zmq_msg_close(&msg);
	}

    return (void *)0;
}


int main()
{
	pthread_t pid,pid_join;

	void* ctx  = zmq_init(0);
	void* pull = zmq_socket(ctx, ZMQ_PUSH);
	zmq_bind(pull, "inproc://pusher");

	pthread_create(&pid_join, NULL, joined_thread, ctx);

	for(int index = 0x00; index < 0x03; index++)
        	pthread_create(&pid, NULL, worker_thread, ctx);

	int index = 0x00;
	while (1)
	{
		zmq_msg_t msg;
		char buf[100] = {0x00};
		sprintf(buf, "%d",index++);
		zmq_msg_init_size(&msg, strlen(buf)+1);
		memcpy(zmq_msg_data(&msg), buf, strlen(buf)+1);
		zmq_send(pull, &msg, 0);
		zmq_msg_close(&msg);
		sleep(0x01);
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值