【linux】多线程编程(C语言编程)

电脑杂谈  发布时间:2020-04-08 09:11:33  来源:网络整理

linux c语言创建线程_c语言程序设计 编程题_c语言多线程编程

多线程编程

一,线程的基本概念

与进程相比,多线程是一种非常节俭的多任务操作. 在linux操作系统下,必须启动一个新进程

它分配独立的地址空间并建立大量数据表以维护其代码段,堆栈段和数据段,这是一种“昂贵的”多任务处理

工作方法;在一个进程中运行多个线程时,它们彼此使用相同的地址空间,共享大部分数据,然后启动一个线程

线程占用的空间比启动进程所需的空间小得多,线程之间切换所需的时间也远小于进程之间的切换

所需时间.

作为一个独立的实体,进程为运行线程提供资源,并构成一个静态环境. 线程是处理器调度的基本单位. 如果

进程的概念描述了单机操作系统的行为,线程的概念描述了多机系统的并行处理.

多线程工作提供了线程之间的便捷通信机制. 因为数据空间是在同一进程之间的线程之间共享的,所以一行

程序的数据可以被其他线程直接使用c语言多线程编程,这不仅快速而且方便.

多线程程序还具有以下优点: 改善应用程序响应,使CPU系统更有效,并改善程序结构.

第二,线程实现

Linux系统下的多线程遵循称为PTHREAD的POSIX线程接口. 要在Linux下编写多线程程序,您需要使用头文件

pthread.h,您需要使用库文件libpthread.a. (因此您需要添加选项: -lpthread进行编译)

(1)创建一个线程: 即确定调用该线程函数的入口点,常用的函数是pthread_create.

原型:

        int pthread(pthread_t * thread, pthread_attr_t * attr, 
            void * ( * start_routine) (void *), void arg));
            
            pthread: 线程标识符
            attr: 线程属性
            start_routine:线程运行函数的起始地址(线程函数名)
            arg:运行函数的参数(线程函数所需的参数)
            返回值:创建成功——返回0,若不为0则为创建线程失败(EAGAIN,EINVAL)

(2)线程挂起

一个进程中的多个线程共享数据段,因此通常程退出后,退出线程占用的资源将不会跟随

程终止时释放. 就像进程中的wait()一样,程之间使用pthread_join()函数来挂起当前线程并等待.

线程结束. pthread_join()是一个线程阻塞的函数,调用它的函数将一直等到等待线程结束.

c语言多线程编程_linux c语言创建线程_c语言程序设计 编程题

请注意,一个线程不能由多个线程等待c语言多线程编程,否则第一个接收信号的线程将成功返回,其余线程将

返回错误代码.

原型:

            int pthread_join(pthread_t th, void ** thread_return);
            
                th: 被等待的线程标识符
                thread_return:用户定义的指针,用于存储被等待线程的返回值

(3)线程结束: 1.相关线程功能的操作结束; 2.调用pthread_exit()函数

原型:

            void pthread_exit(void * retval)
            
            retval:函数的返回代码,即thread_return

示例:

            void thread(void){}//线程运行函数
            pthread_t id;
            pthread(&id,NULL,(void *)thread,NULL);
            //创建线程,第一个NULL —— 生成默认属性的线程,第二个NULL —— 线程运行函数不需要参数
            pthread_join(id,NULL);//挂起线程

三,修改线程属性

thread属性的值不能直接设置,需要调用相关函数进行操作,初始化函数为pthread_attr_init,此函数

必须在pthread_create函数之前调用数字. 属性对象包括是否绑定,是否分离,堆栈地址,堆栈大小和优先级.

默认属性是未绑定,未分离的,默认1MB堆栈,并且具有与父进程相同的优先级. 对于大多数程序,请使用默认值

识别属性就足够了.

1,绑定

关于装订涉及另一个概念: 轻量工艺LWP(轻量工艺). 可以理解为内核线程,系统到线程

资源分配和线程控制是通过轻量级进程实现的. 默认情况下,系统控制要启动多少个灯光过程以及要进入哪个灯光

该过程控制哪些线程. 此状态称为未绑定. 绑定是指某个线程固定地“绑定”到轻线程. 装订线工具

响应速度更高(CPU时间片的调度是针对轻量级进程的. )

通过设置绑定光进程的优先级和调度级别,绑定线程可以满足实时响应等要求

创建绑定线程: (pthread_attr_setscope)

        pthread_attr_t attr;
        pthread_t tid;
        pthread_attr_init(&attr);//初始化属性值,均设为默认值
        pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);//设置绑定状态
        pthread_create(&id, &attr, (void *) my_function, NULL);
            
            attr: 指向属性结构的指针
            绑定类型:PTHREAD_SCOPE_SYSTEM(绑定的),PTHREAD_SCOPE_PROCESS(非绑定的)

c语言程序设计 编程题_linux c语言创建线程_c语言多线程编程

2. 分离

线程的分离状态决定了线程如何终止自身.

非分隔: 原始线程等待创建的线程的结尾,并且仅在pthread_join()函数返回时释放占用的资源.

分离: 不等待其他进程,运行后立即释放占用的资源.

线程分离状态的功能:

            pthread_attr_setdetachstate(pthread_attr_t * attr, int detachstate)
            
            detachstate: PTHREAD_CREATE_DETACHED(分离线程), PTHREAD_CREATE_JOINABLE(非分离线程)

如果将一个线程设置为单独的线程,并且该线程运行非常快,则可能在pthread_create函数中

它在返回之前终止,因此调用pthread_create的线程可能获得错误的线程号. 为避免这种情况,

通常在创建的线程中调用pthread_cond_timewait函数,以使该线程等待一段时间.

3. 优先级

使用函数pthread_attr_getschedparam和pthread_attr_setschedparam将优先级存储在sched_pa​​ram结构中


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-168041-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...