Linux程序设计(7)线程

与进程相比,线程具有以下特点:
1.线程是系统调度分派的最小单位
2.线程没有独立的地址空间,多个线程共享一段地址空间(代码段,资源段共享),线程消耗更少的内存资源,线程间通信更为方便
3.线程称为轻量级进程
可以把线程看作操作系统分配CPU时间的基本单位
定义了一个函数,存储在代码段,各线程都可以进行调用;定义一个全局变量,存储在数据段,各线程都可以访问到。
若一个进程细分为多个线程,多个线程可以同时在不同的CPU上面运行,这样可以一定程度上减少程序的执行时间。
动态线程:线程可在进程执行期间的任意时刻被创建,并且线程的数量事先不需要指定。
线程标识符在某个进程中是唯一的,如果父子进程中创建多个线程,线程标识符可能相同。
int pthread_create(pthread_t thread, const pthread_attr_tattr, void*(*start_routine)(void *), void *arg)
thread:创建线程的线程id指针
attr:设置待创建线程的属性,一般置为NULL
start_routine:一个函数指针,该函数为待创建线程的执行函数
arg:传给线程执行函数的参数

pthread_self()函数用于获取线程id

void pthread_exit(void *retval) #线程退出
retval:一般设置为NULL,表示线程的退出状态
注:return()和exit()也有退出功能,return用于退出函数,exit()用于退出进程

int pthread_cancel(pthread_t thread) #杀死线程
thread:线程id

在进程中,父进程退出,子进程可继续执行;在线程中,作为程序入口的主线程退出,属于同一进程的所有线程都会退出。为了避免主线程提前退出,可使用pthread_join()函数将主线程挂起。
int pthread_join(pthread_t thread, void **retval)
pthread:被等待的线程id
retval:接受thread线程执行函数的返回值,与线程的终止方式有关

为避免终止状态的线程占用内存,线程创建后进行线程分离,被分离的线程在执行结束后会自动释放,不再等待其他线程回收。
int pthread_detach(pthread_ t thread ) #用于线程分离,一般用在creat后,join前。
thread:为待分离线程的id

在编程中需要实现线程同步,因为若不对线程的执行次序加以控制,可能会出现数据混乱。
Linux系统实现线程同步的方式主要有3种:互斥锁,信号量,条件变量。
一个简单的关于线程的程序,编写一个包含2 个线程的程序,在主线程中创建一个全局变量并初始化为0,在另一个线程对这个全局变量进行递加运算,并在结束时向主线程返回一个结果,由主线程打印输出。
程序如下:

#include 
#include 
#include 
#include 

long int var = 0;
void *tfn1(void *arg) {
     
    int i = var;
    for (int j = 0; j < 3; j++) {
     
        i = i + j;
    }
    printf("%d\n",i);
    pthread_exit((void *)i);
    return NULL;
}
int main(void)
{
     
    pthread_t tid1;
    int *ret1;
    pthread_create(&tid1, NULL, tfn1, NULL);
    pthread_join(tid1, (void **)&ret1);
    printf("the result is %d\n",ret1);
    pthread_exit(NULL);
}

结果如下:
在这里插入图片描述

你可能感兴趣的:(Linux程序设计,linux,多线程)