/********************************************************************************************
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;
}
ZMQ PULL/PUSH exercise
最新推荐文章于 2022-06-29 09:57:41 发布