Tilera多线程网络编程总结
http://blog.csdn.net/zwleagle/article/details/8851400
http://blog.sina.com.cn/s/blog_a574f78401015v2o.html
http://www.dssz.com/1341360.html
http://www.dssz.com/1341355.html
多线程网络处理服务器demo
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <sys/wait.h>
- #include <unistd.h>
- #include <arpa/inet.h>
- //#include <openssl/ssl.h>
- //#include <openssl/err.h>
- #include <fcntl.h>
- #include <sys/epoll.h>
- #include <sys/time.h>
- #include <sys/resource.h>
- #include <pthread.h>
- #include <assert.h>
- //#define DEBUG_TILERA
- #ifdef DEBUG_TILERA
- #include <tmc/alloc.h>
- #include <arch/cycle.h>
- #include <arch/spr.h>
- #include <tmc/cpus.h>
- #include <tmc/sync.h>
- #include <tmc/task.h>
- #endif
- /* These are non-NULL pointers that will result in page faults
- * under normal circumstances, used to verify that nobody uses
- * non-initialized list entries.
- */
- #define MAXBUF 1024
- #define MAXEPOLLSIZE 500000
- #define MAX_THREAD_NUMBER 200
- int THREAD_NUMBER = 50;
- int kdpfd;
- struct epoll_event events[MAXEPOLLSIZE];
- struct epoll_event thread_events[MAX_THREAD_NUMBER][MAXEPOLLSIZE];
- int fdpool[MAX_THREAD_NUMBER] = {-1};
- pthread_t handle_receive_thrdid[MAX_THREAD_NUMBER];
- int msgcount = 0;
- int timecount = 0;
- int count_packet= 0;
- pthread_mutex_t connet_count_lock = PTHREAD_MUTEX_INITIALIZER;
- int connect_count = 0;
- pthread_mutex_t curfds_lock;
- int curfds;
- char buffer[MAX_THREAD_NUMBER][MAXBUF + 1];
- pthread_t thread_count;
- cpu_set_t cpus;
- void BubbleSort(unsigned char R[],int n)
- {
- int i,j;
- unsigned char temp;
- for (i=0; i<n-1; i++ )
- {
- for (j=n-2; j>=i; j--)
- {
- if (R[j]>R[j+1])
- {
- temp=R[j];
- R[j]=R[j+1];
- R[j+1]=temp;
- }
- }
- }
- }
- /*
- setnonblocking - 设置句柄为非阻塞方式
- */
- int setnonblocking(int sockfd)
- {
- if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1)
- {
- return -1;
- }
- return 0;
- }
- /*
- handle_message - 处理每个 socket 上的消息收发
- */
- static void *handle_count(void* arg)
- {
- int precount, speed;
- while(1)
- {
- precount = msgcount;
- sleep(5);
- timecount += 5;
- //printf("The tcp connection count is %d\n",count_tcp);
- //printf("The received packets count is %d, time %d\n",msgcount, timecount);
- speed = msgcount - precount ;
- printf("The received speed is %d/5seconds, connect %d, tatol packets %d\n",speed, connect_count, msgcount);
- }
- return NULL;
- }
- static void * handl_receive_msg(void * arg)
- {
- int fdind = 0;
- int nfds = 0;
- int len;
- struct epoll_event ev;
- int fdi;
- char* buf ;
- fdind = (int)arg;
- buf = (char*)&buffer[fdind];
- // printf("fd... %d \n", fdind);
- while(1)
- {
- nfds = epoll_wait(fdpool[fdind], &thread_events[fdind][0], MAXEPOLLSIZE, -1);
- if (nfds == -1)
- {
- perror("epoll_wait");
- break;
- }
- for( fdi = 0; fdi < nfds; fdi++)
- {
- if((thread_events[fdind][fdi].events & EPOLLIN)
- /*&&(!(thread_events[fdind][fdi].events & EPOLLRDHUP))*/)
- {
- while((-1 != (len = recv(thread_events[fdind][fdi].data.fd, buf, MAXBUF, 0)))
- ||((-1 == len) && (EAGAIN != errno)))
- {
- //perror("recv error ");
- //printf("recv error %d fd %d\n", errno, thread_events[fdind][fdi].data.fd);
- //goto next;
- if (len > 0)
- {
- /*printf
- ("%d receive message success total %d bytes data msgcount %d\n",
- new_fd, len, msgcount);*/
- msgcount++;
- BubbleSort(buf ,len);
- }
- else if(len == 0)
- {
- //printf("the socket %d is closed \n", new_fd);
- epoll_ctl(fdpool[fdind], EPOLL_CTL_DEL, thread_events[fdind][fdi].data.fd,&ev);
- close(thread_events[fdind][fdi].data.fd);
- pthread_mutex_lock(&connet_count_lock);
- connect_count--;
- pthread_mutex_unlock (&connet_count_lock);
- break;
- }
- else
- {
- printf(" socket %d receive message fail error code: %d, error message: '%s'\n",
- thread_events[fdind][fdi].events, errno, strerror(errno));
- epoll_ctl(fdpool[fdind], EPOLL_CTL_DEL, thread_events[fdind][fdi].data.fd,&ev);
- close(thread_events[fdind][fdi].data.fd);
- pthread_mutex_lock(&connet_count_lock);
- connect_count--;
- pthread_mutex_unlock (&connet_count_lock);
- //pthread_mutex_lock (&(curfds_lock));
- //curfds--;
- //pthread_mutex_unlock (&(curfds_lock));
- break;
- }
- }
- }
- /* else if((thread_events[fdind][fdi].events & EPOLLRDHUP))
- {
- epoll_ctl(fdpool[fdind], EPOLL_CTL_DEL, thread_events[fdind][fdi].data.fd,&ev);
- close(thread_events[fdind][fdi].data.fd);
- pthread_mutex_lock(&connet_count_lock);
- connect_count--;
- pthread_mutex_unlock (&connet_count_lock);
- printf("event.... %x \n", thread_events[fdind][fdi].events);
- }*/
- else
- {
- printf("other event %u\n",thread_events[fdind][fdi].events );
- }
- }
- }
- return NULL;
- }
- int fd_index = 0;
- int main(int argc, char **argv)
- {
- int listener, new_fd, nfds, n, ret;
- socklen_t len;
- struct sockaddr_in my_addr, their_addr;
- unsigned int myport, lisnum;
- struct epoll_event ev;
- struct rlimit rt;
- int fdind;
- int ind ;
- if(5 != argc)
- {
- printf("Usage: %s <thread_number(0 ~ 200)> <port(0-65535)> <listen queue number> <IP Address> \n", argv[0]);
- exit(1);
- }
- if(argv[1])
- THREAD_NUMBER = atoi(argv[1]);
- if (argv[2])
- myport = atoi(argv[2]);
- else
- myport = 7838;
- if (argv[3])
- lisnum = atoi(argv[3]);
- else
- lisnum = 2;
- #ifdef DEBUG_TILERA
- if (tmc_cpus_get_my_affinity(&cpus) != 0)
- {
- printf("tmc_cpus_get_my_affinity() failed.\n");
- tmc_task_die("tmc_cpus_get_my_affinity() failed.");
- }
- if (tmc_cpus_count(&cpus) < MAX_THREAD)
- {
- printf("\nInsufficient cpus available.\n");
- tmc_task_die("Insufficient cpus available.");
- }
- #endif
- pthread_mutex_init (&connet_count_lock, NULL);
- pthread_mutex_init (&(curfds_lock), NULL);
- for( ind = 0; ind < THREAD_NUMBER; ind++ )
- {
- fdpool[ind] = epoll_create(MAXEPOLLSIZE);
- }
- for( ind = 0; ind < THREAD_NUMBER; ind++)
- {
- pthread_create(&handle_receive_thrdid[ind], NULL, &handl_receive_msg, (void*)ind);
- }
- if (pthread_create(&thread_count, NULL, &handle_count, NULL) != 0)
- {
- #ifdef DEBUG_TILERA
- tmc_task_die("pthread_create() failed.");
- #endif
- }
- /* 设置每个进程允许打开的最大文件数 */
- rt.rlim_max = rt.rlim_cur = MAXEPOLLSIZE;
- if (setrlimit(RLIMIT_NOFILE, &rt) == -1)
- {
- perror("setrlimit");
- exit(1);
- }
- else printf("set the system resource success!\n");
- /* 开启 socket 监听 */
- if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("socket");
- exit(1);
- }
- else
- printf("socket create success!n");
- setnonblocking(listener);
- bzero(&my_addr, sizeof(my_addr));
- my_addr.sin_family = PF_INET;
- my_addr.sin_port = htons(myport);
- if (argv[4])
- my_addr.sin_addr.s_addr = inet_addr(argv[4]);
- else
- my_addr.sin_addr.s_addr = INADDR_ANY;
- if (bind
- (listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
- == -1)
- {
- perror("bind");
- exit(1);
- }
- else
- printf("IP address and port bing success!\n");
- if (listen(listener, lisnum) == -1)
- {
- perror("listen");
- exit(1);
- }
- else
- printf("start to work!\n");
- /* 创建 epoll 句柄,把监听 socket 加入到 epoll 集合里 */
- kdpfd = epoll_create(MAXEPOLLSIZE);
- len = sizeof(struct sockaddr_in);
- ev.events = EPOLLIN;
- ev.data.fd = listener;
- if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0)
- {
- fprintf(stderr, "epoll set insertion error: fd=%d\n", listener);
- return -1;
- }
- else
- printf("listen socket add to epoll success\n");
- curfds = 1;
- while (1)
- {
- /* 等待有事件发生 */
- nfds = epoll_wait(kdpfd, events, MAXEPOLLSIZE, -1);
- if (nfds == -1)
- {
- perror("epoll_wait");
- break;
- }
- /* 处理所有事件 */
- for (n = 0; n < nfds; ++n)
- {
- // printf("The number of fd %d \n", nfds);
- if (events[n].data.fd == listener)
- {
- new_fd = accept(listener, (struct sockaddr *) &their_addr,
- &len);
- if (new_fd < 0)
- {
- perror("accept");
- continue;
- }
- //else
- // printf("connect from %x:%x, allocate socket for %x\n", inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd);
- pthread_mutex_lock(&connet_count_lock);
- connect_count++;
- pthread_mutex_unlock (&connet_count_lock);
- setnonblocking(new_fd);
- ev.events = EPOLLIN | EPOLLET;
- ev.data.fd = new_fd;
- fdind = fd_index % THREAD_NUMBER;
- if (epoll_ctl(fdpool[fdind], EPOLL_CTL_ADD, new_fd, &ev) < 0)
- {
- fprintf(stderr, "add socket '%d' to epoll fail %s\n",
- new_fd, strerror(errno));
- // pool_destroy ();
- return -1;
- }
- fd_index++;
- //pthread_mutex_lock (&(curfds_lock));
- // curfds++;
- // pthread_mutex_unlock (&(curfds_lock));
- }
- else
- {
- printf("other event \n");
- }
- }
- }
- close(listener);
- // pool_destroy ();
- return 0;
- }
tilera试用
tilera处理器架构
Tilera多线程网络编程总结相关推荐
- day16多线程网络编程日志枚举
多线程&网络编程 一.实现多线程 1.1 相关概念 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的一条执行路径.实际运作单位.简单理解:应用软件中互相独立,可以同时运 ...
- Linux多线程网络编程要义丨epoll与reactor原理
linux多线程网络编程要义 1. epoll原理剖析 2. 单reactor原理以及应用 3. 多reactor原理以及应用 [Linux服务器系列]Linux多线程网络编程要义丨epoll与rea ...
- 【Linux服务器开发系列】详解多线程网络编程丨百分百干货分享丨学到就是赚到
90分钟搞懂多线程网络编程模型 1. 网络编程关注的问题 2. 网络编程的几种模型reactor,one loop per thread及其变种 3. skynet,redis,nginx,memca ...
- HSHA多线程网络编程模型介绍
我在上一篇的分享<Leader/Follower多线程网络模型介绍>中详细介绍了LF多线程网络模型的原理和代码分析.它的思路是减少线程上下文切换和数据拷贝时间,通过角色转换,来提高处 ...
- Java高并发与多线程网络编程
目录 一. 基础 1. 线程介绍 2. 创建并启动线程 3. 函数式接口编程 4. Thread 构造器 5. 守护线程 线程关系 6. join 7. interrupt 8. 优雅的结束线程 9. ...
- python多线程网络编程_python网络编程之线程
一 .背景知识 1.进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令 ...
- python多线程网络编程_python之网络编程-多线程
死锁现象,递归锁 所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,若无外力作用,他们将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远在相互 ...
- QT多线程网络编程程序崩溃问题与解决
环境:Ubuntu14.04,Qt5.5 平台:QtCreator 场景:有以下三个线程:1.gstreamer循环取摄像头视频帧,25fps:2.HTTP循环请求消息并显示在QDoubleSpinB ...
- 多线程+SOCKET编程实现qq群聊的服务端和客户端
多线程+SOCKET编程实现qq群聊的服务端和客户端 标签(空格分隔): 多线程 网络编程 线程同步 一.设计思路 1.服务端 每来一个客户端连接,服务端起一个线程维护: 将收到的消息转发给所有的客户 ...
- 索骥馆-编程语言之《网络编程实用教程(第2版)》扫描版[PDF]
内容介绍: 本书主要介绍基于tcp/ip协议栈的套接字网络编程技术.全书分为10章,第1章介绍网络编程基础,第2章介绍套接字网络编程接口,第3章介绍windows环境的网络编程,第4章介绍mfc编程, ...
最新文章
- Solaris 10 系统维护
- 处理时间_7_60个Mysql日期时间函数汇总
- 大规模运行MongoDB应该知道的10件事
- Swift 学习手记1,pod 的 类库使用
- 密码学专题 密钥生成|分组加密的模式 ECB|CBC|CFB|OFB
- powerdesigner 16设计mysql数据库_PowerDesigner16 连接MySql 报错
- java自定义equals函数和hashCode函数
- “熊猫烧香”有新变种 可自动下载病毒
- 不知道如何raw转换成jpg格式?可以试试这几个软件
- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest A Toda2 贪心
- no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
- 金融网络安全和反欺诈方法论,金融新兴技术成熟度几何?
- 一个快速的人脸检测库
- 通用mapper 根据条件修改、查询
- java 垃圾收集器_JVM垃圾收集器详解
- vue指令学习——vue基本用法
- 趋势科技协助FBI破获大型跨国网络犯罪案 瓦解超过400万Botnet 殭尸大军
- 目标检测中的遮挡问题及优化
- mysql树状结构查询子节点和父节点
- 高中学历能找到程序员的工作吗?