Linux : 线程(thread)

本文介绍了Linux下基于POSIX标准的pthread多线程编程技术,包括线程的创建、终止、等待、标识及清除等核心操作,并通过示例代码详细展示了如何使用这些API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


线程:

  1. 优点:节俭,可以共享堆栈段,数据段。同一个进程下的线程可以共享数据空间。
  2. Linux下的多线程遵循的是POSIX线程接口,称为pthread (头文件pthread.h),连接使用的库是lib pthread.a .

 

 一.创建线程

int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void *(*start_rtn)(void), void *arg)

(1). tidp: 线程id (获取线程的id).

(2). attr: 线程属性 (一般为空NULL).

(3). start_rtn: 线程要执行的函数.

(4). arg: start_rtn函数的参数.

(5). 返回值: 0 代表成否,其它为错误.

编译时要加上 -lpthread

例子: gcc file.c -lpthread -o file

 

二.线程终止

线程从启动到进程中返回.(return)

线程可以被另一个进程终止.

线程自己调用终止函数.(pthread_exit)

void pthread_exit(void *rval_ptr)

功能:终止调用的线程.

rval_ptr: 线程退出返回值的指针.

 

三.线程的等待 (堵塞)

int pthread_join(pthread_t pid, void **rval_ptr)

功能:阻塞调用线程的进程,直到指定的线程终止.

tid: 等待退出的线程id. (pthread_create获取)

rval_ptr: 线程退出的返回值指针.

 

四.线程标识

pthread_t pthread_self(void)

功能:获取线程标识符.

 

五.线程清除

从pthread_cleanup_push的调用点到pthrad_cleanup_pop之间的程序段中的终止动作(包括调用pthread_exit和异常终止,但是不包括return)都将执行.

void pthread_cleanup_push(void (*rtn)(void *), void *arg)

功能:清除函数压入清除栈中.

rtn: 清除函数.

arg: 清除函数的参数.

 

void pthread_cleanup_pop(int execute)

功能: 清除函数出栈.

execute: 非0执行 0不执行 (异常出现都会执行 不管0还是非0).

 

例子:

//线程清除函数

 

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>


void *clean(void *arg)
{
    printf("cleanup :%s  \n",(char *)arg);
    return (void *)0;
}
void *thr_fn1(void *arg)
{
    printf("thread 1 start  \n");
    pthread_cleanup_push( (void*)clean,"thread 1 first handler");
    pthread_cleanup_push( (void*)clean,"thread 1 second hadler");
    printf("thread 1 push complete  \n");
    if(arg)
    {
        return((void *)1);
    }
    pthread_cleanup_pop(0);
    pthread_cleanup_pop(0);
    return (void *)1;
}


void *thr_fn2(void *arg)
{
    printf("thread 2 start  \n");
    pthread_cleanup_push( (void*)clean,"thread 2 first handler");
    pthread_cleanup_push( (void*)clean,"thread 2 second handler");
    printf("thread 2 push complete  \n");
    if(arg)
    {
        pthread_exit((void *)2);
    }
    pthread_cleanup_pop(0);
    pthread_cleanup_pop(0);
    pthread_exit((void *)2);
}


int main(void)
{
    int err;
    pthread_t tid1,tid2;
    void *tret;

 

    err = pthread_create(&tid1,NULL,thr_fn1,(void *)1);
    if(err != 0)
    {
        printf("error .... \n");
        return -1;
    }
    err = pthread_create(&tid2,NULL,thr_fn2,(void *)1);

 

    if(err != 0)
    {
        printf("error .... \n");
        return -1;
    }
    err = pthread_join(tid1,&tret);
    if(err != 0)
    {
        printf("error .... \n");
        return -1;
    }
    printf("thread 1 exit code %d  \n",(int)tret);

 

    err = pthread_join(tid2,&tret);
    if(err != 0)
    {
        printf("error .... ");
        return -1;
    }

 

    printf("thread 2 exit code %d  \n",(int)tret);
   
    return 1;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值