Linux 多线程

前言

这篇博客又拖了一周,即将迎来考试周,一大堆课设要交,一大堆报告要写。前几天又惹亲爱的生气了,刚刚缓和过来,心情大好。最近在看一本叫《把时间当做朋友》的关于时间管理的书,感觉获益良多。我要学会控制自己的大脑。

多线程

多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”,利用它编程的概念就叫作“多线程处理”。--摘自《百度百科》

线程相关函数

pthread_cond_init(pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr);

用来初始化一个条件变量。其中cond是一个指向结构pthread_cond_t的指针,
cond_attr是一个指向结构pthread_condattr_t的指针。
结构pthread_condattr_t是条件变量的属性结构,和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用,默认值是PTHREAD_ PROCESS_PRIVATE,即此条件变量被同一进程内的各个线程使用;如果选择为PTHREAD_PROCESS_SHARED则为多个进程间各线程公用。注意初始化条件变量只有未被使用时才能重新初始化或被释放。

pthread_mutex_init();

以动态方式创建互斥锁的,参数attr指定了新建互斥锁的属性。如果参数attr为空,则使用默认的互斥锁属性,默认属性为快速互斥锁。

pthread_attr_init(pthread_attr_t *attr);

指向一个线程属性结构的指针,结构中的元素分别对应着新线程的运行属性。属性对象主要包括是否绑定、是否分离、堆栈地址和大小、优先级等。

pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

设置线程分离状态的函数,第二个参数可选为PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)。线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。

Server

/* TCPmtechod.c - main, TCPechod, prstats */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include #define QLEN          32    
#define BUFSIZE     4096#define INTERVAL    5   /* secs */#define  MAXTHREADS 10
#define  MAXCLIENTS 128int client_array[MAXCLIENTS];   /*socket descriptors for client connection waiting to handle*/
int iput, iget;                 /*index for main thread put and sub-thread get*/
pthread_cond_t  cli_cond;
pthread_mutex_t cli_mutex;struct {pthread_mutex_t st_mutex;     // 互斥变量,防止多个线程同时访问接口体其他数据unsigned int    st_concount;  // 已连接通信量unsigned int    st_contotal;  // 已完成通信量unsigned long   st_contime;   // 连接总时间unsigned long   st_bytecount; // 通信流量                   
} stats;                          // 监视函数变量void prstats(void);               // 监控函数
int TCPechod(int fd);
int errexit(const char *format, ...);
int passiveTCP(const char *service, int qlen);int thread_make(void);
void thread_main(void);int main(int argc, char *argv[])
{pthread_t th;              //  创建线程变量   pthread_attr_t ta;         //  线程变量指针char *service = "echo";    /* service name or port number   */struct sockaddr_in fsin;   /* 客户地址     */unsigned int alen;         /* 客户地址长度   */int msock;                 /* 主服务器套接字 */int ssock;                 /* 从服务器套接字 */switch (argc) {case 1:break;case 2:service = argv[1];break;default:errexit("usage: Server [port]\n");}msock = passiveTCP(service, QLEN);   // 被动套接字(void) pthread_cond_init(&cli_cond,0);(void) pthread_mutex_init(&cli_mutex,0);(void) pthread_attr_init(&ta);      // 将ta初始化(void) pthread_attr_setdetachstate(&ta, PTHREAD_CREATE_DETACHED);(void) pthread_mutex_init(&stats.st_mutex, 0);  // 初始化互斥if (pthread_create(&th, &ta, (void * (*)(void *))prstats, 0) < 0) // 创建新线程printf("pthread_create error\n");int i;for(i=0; i

运行结果

613086-20160105080949746-1938379811.png

613086-20160105081000106-2013304254.png

转载于:https://www.cnblogs.com/pengzhendong/p/5100928.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部