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 <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

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);
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值