pthread

pthread_join函数及linux线程

自闭症网瘾萝莉.ら 提交于 2020-02-26 02:48:20
pthread_join使一个线程等待另一个线程结束。 代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。 所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。 下面说一下如何创建一个线程。 通过创建线程,线程将会执行一个线程函数,该线程格式必须按照下面来声明: void * Thread_Function(void *) 创建线程的函数如下: int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg); 下面说明一下各个参数的含义: thread:所创建的线程号。 attr:所创建的线程属性,这个将在后面详细说明。 start_routine:即将运行的线程函数。 art:传递给线程函数的参数。 下面是一个简单的创建线程例子: #include <pthread.h> #include <stdio.h> /*

RS485串口编程

故事扮演 提交于 2020-02-25 20:08:10
1.1 单工、半双工、全双工 首先,我使用的是芯片为 SP3485E 为半双工通信。 那么先要明确什么是单工、半双工、全双工。 单工数据传输只支持数据在一个方向上传输; 半双工数据传输允许数据在两个方向上传输 ,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信; 全双工数据通信允许数据同时在两个方向上传输 ,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 网卡的全双工(Full Duplex)是指网卡在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的网卡一般都支持全双工。 提到全双工,就不能不提与之密切对应的另一个概念,那就是“半双工(Half Duplex)”, 所谓半双工就是指一个时间段内只有一个动作发生 ,举个简单例子,一条窄窄的马路,同时只能有一辆车通过, 当目前有两量车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。早期的对讲机、以及早期集线器等设备都是基于半双工的产品。随着技术的不断进步,半双工会逐渐退出历史舞台。 1.2 关于RS485通信 RS232 标准是诞生于 RS485 之前的,但是 RS232 有几处不足的地方: 接口的信号电平值较高, 达到十几 V,使用不当容易损坏接口芯片

pthread_create

放肆的年华 提交于 2020-02-25 14:46:59
pthread_create 编辑本段 函数简介   pthread_create是UNIX环境创建线程函数 头文件   #include<pthread.h> 函数声明   int pthread_create( pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg); 返回值   若成功则返回0,否则返回出错编号   返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。   linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。   由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间

linux网络多线程编程实例

让人想犯罪 __ 提交于 2020-02-24 14:43:06
用的是UDP方式。 服务器能同时接受十个客户端,各个客户端可以相互点对点通讯;可以对所有连到 服务器的客户端广播;也可以和服务器通讯。服务器也可以广播。 运行时你要先看懂源代码中的命令: "/w " 广播 ; "/s n " 对某个客户端; "/sv "对服务器; 命令是引号中的部分,注意空格。 服务端代码: #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include <sys/wait.h> #include <netinet/in.h> #include<arpa/inet.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include <pthread.h> #define PORT 8889 #define max_size 256 ///////////////////////////////////////////////////////// int sockfd,sockfd2[10],ret,i=0,j,flag=0; struct sockaddr_in addr; struct sockaddr_in addr2[10]; int

Linux多线程编程初探

南笙酒味 提交于 2020-02-24 14:37:20
Linux线程介绍 进程与线程   典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。     进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。   线程 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程包含了表示进程内执行环境必须的信息,其中包括进程中表示线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno常量以及线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。在Unix和类Unix操作系统中线程也被称为轻量级进程(lightweight processes),但轻量级进程更多指的是内核线程(kernel thread),而把用户线程(user thread)称为线程。 "进程——资源分配的最小单位,线程——程序执行的最小单位"  

Linux多线程编程 - sleep 和 pthread_cond_timedwait

≯℡__Kan透↙ 提交于 2020-02-24 14:28:09
#include <stdio.h> #include <stdlib.h> int flag = 1; void * thr_fn(void * arg) { while (flag){ printf("******\n"); sleep(10); } printf("sleep test thread exit\n"); } int main() { pthread_t thread; if (0 != pthread_create(&thread, NULL, thr_fn, NULL)) { printf("error when create pthread,%d\n", errno); return 1; } char c ; while ((c = getchar()) != 'q'); printf("Now terminate the thread!\n"); flag = 0; printf("Wait for thread to exit\n"); pthread_join(thread, NULL); printf("Bye\n"); return 0; } 输入q后,需要等线程从sleep中醒来(由挂起状态变为运行状态),即最坏情况要等10s,线程才会被join。采用sleep的缺点:不能及时唤醒线程。 采用pthread_cond_timedwait函数

多线程编程总结

这一生的挚爱 提交于 2020-02-24 05:48:57
一、线程模型: 线程是程序中完成一个独立任务的完整执行序列,即一个可调度的实体。根据运行环境和调度者的身份,线程可分为 内核线程和 用户线程。 内核线程:运行在内核空间,由内核来调度; 用户线程:运行在用户空间,由线程库来调用。 当进程的一个内核线程获得CPU的使用权时,它就加载并运行一个用户线程。可见,内核程序相当于用户线程运行的容器。一个进程可以拥有M个内核线程和N个用户线程,其中M≤N。并且在一个系统的所有进程中,M和N的比值都是固定的。按照M:N的取值,线程的实现方式可分为三种模式: 完全在用户空间实现、 完全由内核调度和 双层调度。 1、完全在用户空间实现的线程无须内核的支持,内核甚至根本不知道这些现成的存在。线程库负责管理所有执行线程,比如线程的优先级、时间片等。线程库利用longjmp来切换线程的执行,使它们看起来像是“并发”执行的。但实际上内核仍然是把整个进程作为最小单位来调度的。换句话说,一个进程的所有执行线程共享该进程的时间片,它们对外表现出相同的优先级。因此,对于这种实现方式而言,M=1,即N个用户空间线程对应1个内核线程,而该内核线程实际上就是进程本身。 完全在用户空间实现的线程的优点是:创建和调度线程都无需内核的干预,因此速度相当快。并且由于它不占用额外的内核资源,所以即使一个进程创建了很多线程,也不会对系统性能造成明显的影响。其缺点是:对于多处理器系统

线程池代码

╄→尐↘猪︶ㄣ 提交于 2020-02-23 13:41:21
/*** threadpool.h ***/ #ifndef __THREADPOOL_H_ #define __THREADPOOL_H_ typedef struct threadpool_t threadpool_t; /** * @function threadpool_create * @descCreates a threadpool_t object. * @param thr_num thread num * @param max_thr_num max thread size * @param queue_max_size size of the queue. * @return a newly created thread pool or NULL */ threadpool_t *threadpool_create(int min_thr_num, int max_thr_num, int queue_max_size); /** * @function threadpool_add * @desc add a new task in the queue of a thread pool * @param pool Thread pool to which add the task. * @param function Pointer to the

Linux C 实现一个简单的线程池

痴心易碎 提交于 2020-02-23 12:54:38
线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。 什么时候需要创建线程池呢? 简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。 实现程序(未完成相关资源的释放操作) /******************** Pthread Pool 14/06/18 22:06 ********************/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <pthread.h> #include <pthread.h> /* 任务节点结构 */

线程池的简单实现

我与影子孤独终老i 提交于 2020-02-23 12:54:15
/*pthreadpool.h*/ #ifndef PTHREADPOOL 2 #define PTHREADPOOL 3 #include<pthread.h> 4 5 struct task_node{ 6 7 void *(*run)(void *arg);//一个函数指针 8 void *arg;//函数指针的参数 9 struct task_node *next; 10 }; 11 12 typedef struct task_node task_node; 13 14 struct pthreadpool{ 15 task_node *head;//任务队列的头指针 16 task_node *top;//任务队列的尾指针 17 18 int max_pthread;//线程池创建线程的最大数 19 20 int pthread_num;//线程的数目 21 int pthread_wait_num;//等待线程的数目 22 int pthread_work_num;//工作线程的数目 23 24 pthread_mutex_t mutex;// 用于保护任务队列的互斥锁 25 pthread_cond_t cond;// 一个条件变量 26 }; 27 typedef struct pthreadpool pthreadpool; 28 29 //线程池的初始化 30