天天看点

Linux的多线程线程的概念线程的使用应用经验版权声明

线程的概念

       和多进程相比,多线程是一种比较节省资源的多任务操作方式。启动一个新的进程必须分配给它独立的地址空间,每个进程都有自己的堆栈段和数据段,系统开销比较高,进行数据的传递只能通过进行间通信的方式进行。在同一个进程中,可以运行多个线程,运行于同一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享全局数据,启动一个线程所消耗的资源比启动一个进程所消耗的资源要少。

线程的使用

1、创建线程

       在Linux下,采用pthread_create函数来创建一个新的线程,函数声明:

       包含头文件:

              #include <pthread.h>

       函数声明:

              int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

       参数thread为为指向线程标识符的地址。

       参数attr用于设置线程属性,一般为空,表示使用默认属性。

       参数start_routine是线程运行函数的地址。

       参数arg是线程运行函数的参数。新创建的线程从start_routine函数的地址开始运行,该函数只有一个无类型指针参数arg。  

       在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库。

2、线程的终止

        如果进程中的任一线程调用了exit,则整个进程会终止,所以,在线程的start_routine函数中,不能采用exit。

       线程的终止有三种方式:

       1)线程的start_routine函数代码结束,自然消亡。

       2)线程的start_routine函数调用pthread_exit结束,不想活了。

       3)被主进程或其它线程中止,被杀了,一般情况不会这么做。

       pthread_exit函数的声明如下:

              void pthread_exit(void *retval);

       参数retval填空。

3、线程示例

       我们把TCP通信的服务端(book249.cpp)程序改一下,由多进程改为多线程。

       线程主函数的声明:

Linux的多线程线程的概念线程的使用应用经验版权声明

       线程主函数的定义:

Linux的多线程线程的概念线程的使用应用经验版权声明

       主程序的main函数book261.cpp

Linux的多线程线程的概念线程的使用应用经验版权声明

       需要注意一个问题:

       1)线程可以共享全局变量,当然也可以共享TcpServer的m_clientfd成员变量,但是,创建线程的时候,为什么要把客户端的socket用参数传给线程主函数,而不是直接获取TcpServer.m_clientfd的值,因为主进程调用pthread_create创建线程后,立即返回循环重新Accept,创建线程需要时间,如果在这段时间内有新的客户端连接上来,TcpServer.m_clientfd的值会发生改变。

       2)线程主函数的函数体中,不能使用return语句,如果想退出线程,可以用pthread_exit(0);返回。

应用经验

       Linux没有真正意义上的线程,它的实现是由进程来模拟,属于用户级线程。所以,在Linux系统下,进程与线程在性能和资源消耗方面没有本质的差别。对我们程序员来说,进程不能共享全局数据,线程可以共享全局数据,各位可以根据应用场景选择采用多进程或多线程。

版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net)

作者:码农有道

如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

继续阅读