Linux c 开发 - 线程

本文详细介绍了Linux下线程API的使用方法,包括线程创建、调度设置、等待及终止等,并通过一个具体的线程例子展示了如何利用互斥锁和条件变量实现线程间的同步。

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

目录

一、线程API

1.  线程创建API

2. 线程调度设置API

3. 线程等待API

4. 线程终止API

5. mutex互斥锁API

6. conf条件变量API

二、一个线程的例子


Linux中多进程是内核本身就支持的,而多线程则需要Thread库来支持。

编译的时候需要带上 -l thread命令

gcc main.c  -o main -l pthread

一、线程API


1.  线程创建API


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

参数:

  • thread:返回创建的线程的ID
  • attr:线程属性,调度策略、优先级等都在这里设置,如果为NULL则表示用默认属性
  • start_routine:线程入口函数,可以返回一个void*类型的返回值,该返回值可由pthread_join()捕获
  • arg:传给start_routine的参数,可以为NULL
  • 返回值:创建线程成功为0

2. 线程调度设置API


线程调度策略三种:

  • SCHED_OTHER:非实时、正常
  • SCHED_RR:实时、轮询法
  • SCHED_FIFO:实时、先入先出,与vxworks的调度机制一致
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_FIFO);

3. 线程等待API


pthread_join(pthread_t id, void **ret)

参数:

  • id : 线程ID
  • ret:可以设置为NULL

说明:使用了pthread_join后,会线程等待,直到等待的线程执行完毕之后 当前线程才会执行。

4. 线程终止API


线程终止有三种方法:

  • 当前线程的函数中有retrun进行返回,则结束,一般用的最多
  • 调用了pthread_exit(void *ret) 线程终止方法,则终止
  • 被同一进程中的其他线程取消
pthread_exit(void *ret);

5. mutex互斥锁API


#定义一个锁
pthread_mutex_t lock; 
#初始化一个锁
pthread_mutex_init(&lock,NULL);
#销毁一个锁
pthread_mutex_destroy(&lock)
# 加锁
pthread_mutex_lock(&lock)
#解锁
pthread_mutex_unlock(&lock)

6. conf条件变量API


#定义一个条件
pthread_cond_t cond;
#初始化一个条件
pthread_cond_init(&cond, NULL)
#等待一个条件
pthread_cond_wait(&cond,&mutex); //解锁并等待
#唤醒一个条件
pthread_cond_signal(&cond); //唤醒一个条件

二、一个线程的例子


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

int i = 0;
pthread_mutex_t mut;
void* tprocess1(void* args){
        pthread_mutex_lock(&mut); //上锁
        i++;
        pthread_mutex_unlock(&mut); //解锁
        printf( "tprocess1:%d\n", i);
        sleep(10);
        printf("Hello World\n");
        return NULL;
}

void* tprocess2(void* args){
        pthread_mutex_lock(&mut); //锁定
        i++;
        pthread_mutex_unlock(&mut); //解锁
        printf("tprocess2: %d\n", i);
        sleep(5); //线程sleep
        printf("Helloo===========\n");
        return NULL;
}


int main() {
         pthread_t t1;
         pthread_t t2;
         pthread_mutex_init(&mut, NULL); //初始化锁
         pthread_create(&t1,NULL,tprocess1,NULL); //创建线程1
         pthread_create(&t2,NULL,tprocess2,NULL); //创建线程2
         pthread_join(t1, NULL); //等待线程1结束
         pthread_mutex_destroy(&mut); //销毁
         printf("%d", t1);
         return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值