Linux编程培训哪家好_linux编程培训哪家好
Linux编程培训哪家好由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“linux编程培训哪家好”。
中国IT职业教育领先品牌
精品课程 全程面授
Linux编程培训哪家好
想知道Linux编程培训哪家好?先来了解一下什么是Linux编程吧!Linux下的网络编程指的是socket套接字编程,入门比较简单。在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾。总感觉每次看的时候都有收获,但是每次看完了之后,过段时间不看,重新拾起这些知识的时候又要从头开始,所以,在这里做个笔记也算是做个模板,以后可以直接从某一个阶段开始接着玩……
Linux线程介绍
通过socket机制建立起的连接,仅仅实现的是服务器端和客户端之间的通信,数据的传输。但是要使网络编程实现性能更优的话,少不了使用线程,线程间通信以及IO函数,接下来就简单讲一下线程,线程间通信,以及IO函数中的select函数。
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
Linux下的线程,线程是进程中的一个运行单元,进程fork子进程的过程是对父进程进程copy的过程,然后紧紧改变子进程本身的一些变量,之后各自的进程运行属于自己进程空间的内容;而线程的创建则不然,线程创建在进程中有自己固定的创建函数,在同一个进程中创建的所有线程会共用所在进程的全局变量,信号句柄,文件描述符和当前的目录状态,但是每个线程又会有属于自己的线程栈等私有的属性。进程获得的使用资源被分给了每个线程,除公共部分外每个线程之间的运行又是相对独立的。Linux下线程的基本函数: 1 线程创建函数pthread_create
intpthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);功能介绍:
该函数是用于在进程中创建线程,线程在进程中创建有固定的形式。个人理解,线程的创建就是圈起了一段代码作为一个线程,这段被圈起来的函数作为线程函数,线程开始运行就是从线程函数开始运行,线程函数也有固定的格式,因为格式固定,线程的创建把单独作为参数的线程函数和线程函数参数整合到一起,形成一个线程。当然在创建的同时,会设置当前线程的属性,以及用于操作的线程标识符。参数说明:
thread:第一个参数是一个pthread_t类型的线程标识符,可以通过操作该标识符,实现对线程的操作;
attr:第二个参数是用来设置线程的属性,包括线程优先级等属性;
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
start_routine:第三个参数是指当线程成功创建后,开始运行的一个单元,该单元需要自己编写,一般会使用无限循环来实现;
arg:第四个参数是第三个参数线程函数运行时传入的参数,为了防止每个线程函数输入参数不同而难以操作,所以线程创建讲两者分开,这样更灵活,便于操作。线程结束函数pthread_join和pthread_exit 2.1 线程函数结束pthread_exit
void pthread_exit(void *retval);功能介绍:
该函数主要的功能是从被圈起来的线程函数中退出,退出过程中会通过函数的参数指针带出一个对象,当等待线程结束函数pthread_join的第二个参数不是NULL时,会传给这个参数做相应的处理。参数说明:
函数的参数是一个指针,通过该指针可以传递出当前进程结束时的相关信息,这个值会被pthread_join捕捉到。2.2 等待线程结束pthread_join
int pthread_join(pthread_t th,void **return_value);功能介绍:
函数主要功能是等待线程结束,pthread_exit是主动结束线程,该函数是被动等待线程结束。函数会处于等待状态,如果函数的第二个参数没有设置为NULL,则会捕捉到从exit传递回的信息。参数说明:
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
第一个参数是要等待的线程的标识符,有phread_create函数第一个参数指定其值是多少;第二个参数是一个二维指针,用于等待从pthread_exit返回值。当然,如果不适用pthread_exit结束线程函数的话,线程函数结束,也就是调用函数的线程结束。当线程函数运行结束时,该函数用于回收线程的资源。
对于讲理论来说,大家往往更喜欢实例,下面是一个线程的小例子。
#include 2 #include 3 #include
pthread_tpth[2];6
void *print_meage(void *argv)8 { 9
printf(“This is in thread %x!n”, *((pthread_t *)argv));10
if(&pth[0] == argv)12
{ 13
sleep(1);14
pthread_exit(“1 thread exit!”);15
} 16
else
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
{ 18
sleep(10);19
pthread_exit(“2 thread exit!”);20
} 21 } 22 intmain(void)24 { 25
void *returnValue;26
printf(“This is in main function BEFORE pthread create!n”);28
pthread_create(&pth[0], NULL, &print_meage, &pth[0]);29
pthread_create(&pth[1], NULL, &print_meage, &pth[1]);30
printf(“This is in main function AFTER pthread create %x!n”, pth[0]);31
pthread_join(pth[0], &returnValue);32
printf(“This is in main function AFTER pthread join 1n”);33
pthread_join(pth[1], &returnValue);34
printf(“This is in main function returnValue=%sn”, returnValue);35
printf(“This is in main function AFTER pthread joinn”);36
return 0;37 }
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
下面是运行结果:
这个只是运行结果,其实一些动态的东西,也看不到,因为pthread_join是阻塞等待线程结束的,所以说这个代码是线程1等待一秒首先结束线程运行,pthread_join会捕捉到线程结束,线程2会在线程1结束运行后约9s然后结束运行,这时候线程2的pthread_join才会捕捉到线程结束并释放资源。所以如果是使用多线程并且在同一个地方统一使用pthread_join释放资源时,最好先释放首先结束运行的线程,然后在释放后结束的线程。否则的话如果使用pthread_join先释放后结束运行的线程,先结束运行的线程资源因为等待前面pthread_join结束而得不到释放。
因为线程是在进程中创建的,线程公用进程中的资源,所以线程资源的释放非常重要。主要的线程资源释放的方法有下面三种:
1)在线程函数中调用pthread_detach(pthread_self()),主动释放线程资源; 2)向上面介绍的pthread_join函数,被动释放线程资源;
3)通过设置线程属性中的__detachstate属性,在线程函数运行完,或者pthread_exit退出时,自动释放线程资源,设置线程属性通过下面方式,pthread_attr_tatt;//线程属性
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
pthread_attr_init(&att);//初始化线程属性
pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED);//设置线程属性
pthread_create(pthread_t *pthread, &att, void *(*thread_function)(void *),(void *argv));//建立线程 3 线程的属性
线程创建函数pthread_create的第二个参数是指线程的属性,当该参数设置为NULL时,表示使用了线程的默认属性。其实我们可以通过设置第二个参数来设置线程的属性。线程属性的改变有属于自己的结构体和函数。线程属性的结构体
typedefstruct __pthread_attr_s { int
__detachstate;
/*线程的终止状态*/ int
__schedpolicy;
/*调度优先级*/ int
__sched_param
__shedparam;
/*参数*/ int
__inheritsched;
/*继承*/ int
__scope;
/*范围*/ int
__guardsize;
/*保证尺
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
寸*/ int
__stackaddr_set
/*运行栈*/
void
*__stackaddr;
/*线程运行栈地址*/ size_t
__stacksize;
/*线程运行栈大小*/ }pthread_attr_t;
线程主要的属性对象包括上面提到的这几种,线程的属性不可以直接设置,需要通过特定的函数来实现,可以通过函数对上面这几种线程属性进行修改。并且线程属性的修改要在创建线程之前完成。线程属性的初始化函数为pthread_attr_init,通过如下所示的函数可以说明线程的属性参数都可以做修改,需要再次强调的是这些参数的修改需要在创建线程之前完成,将修改后的属性参数通过pthead_create的第二个参数传入到线程中,具体函数如下:(具体如何使用可参考http://blog.csdn.net/hudashi/article/details/7709413)1).线程优先级设置属性,需要先获得线程当前属性优先级,然后通过设置操作修改属性优先级
intpthread_attr_getschedparam(pthread_attr_t* attr, structsched_param* param);intpthread_attr_setschedparam(pthread_attr_t* attr, structsched_param* param);
千锋教育www.daodoc.com
中国IT职业教育领先品牌
精品课程 全程面授
2).设置线程范围属性
intpthread_attr_setscope(pthread_attr_t* attr, int scope);3).设置线程终止状态属性
intpthread_attr_setdetachstate(pthread_attr_t* attr, intdetachstate);4).设置线程保护区大小属性
intpthread_attr_setguardsize(pthread_attr_t* attr,size_tguardsize);5).设置线程继承调度属性
intpthread_attr_setinheritsched(pthread_attr_t* attr, intinheritsched);6).设置线程栈基址以及堆栈的最小尺寸大小 intpthread_attr_setstack(pthread_attr_t* stackader,size_tstacksize);7).设置线程栈基址属性
intpthread_attr_setstackaddr(pthread_attr_t* attr, void* stackader);8).设置线程栈的大小属性
intpthread_attr_setstacksize(pthread_attr_t* attr, size_tstacksize);
以上就是千锋Linux学院的学习笔记。另附心得体会一篇:
从零基础开始学Linux或者是转行学习Linux,参加培训会保证你在单位时间内学到更多,毕竟随着Linux行业的快速发展,未来必将会面临更多的竞争,所以只有不遗余力的把自己打造成一把利剑,从专业度到职业素质,只有比别人更突出和优秀,才能够在这个相互选择的世界当中拥有更多的选择权利。现在想
千锋教育www.daodoc.com
attr, void*
中国IT职业教育领先品牌
精品课程 全程面授
要学习Linux技术,只有通过参加培训才可以保证快速掌握所学知识和技能,所以培训是比较靠谱的。
Linux编程培训哪家好?千锋教育的Linux课程专注于当前热门的Linux相关技术,就Linux而言,内容全面而细致的。Linux教学团队由众多名师打造,拥有多年教学经验和高超的Linux授课技巧和实战视野,让你理论和实战兼得。
千锋教育www.daodoc.com