linux多线程
发布日期:2021-06-30 12:11:05 浏览次数:3 分类:技术文章

本文共 2910 字,大约阅读时间需要 9 分钟。

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); //唤醒一个条件

 

int x,y;pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;pthread_mutex_lock(&mut);while (x <= y) {    pthread_cond_wait(&cond, &mut);}/* operate on x and y */pthread_mutex_unlock(&mut);
pthread_mutex_lock(&mut);/* modify x and y */if (x > y) pthread_cond_signal(&cond); //pthread_cond_broadcast(&cond);pthread_mutex_unlock(&mut);

两个线程,第一个线程当X<=Y时就挂起,直到X>Y时才继续执行(由第二个线程可能会修改X,Y的值,当X>Y时唤醒第一个线程),即首先初始化一个普通互斥量mut和一个条件变量cond。

    在第一个线程执行到pthread_cond_wait(&cond,&mut)时,此时如果X<=Y,则此函数就将mut互斥量解锁 ,再将cond条件变量加锁 ,此时第一个线程挂起 (不占用任何CPU周期)。

    第二个线程中,本来因为mut被第一个线程锁住而阻塞,此时因为mut已经释放,所以可以获得锁mut,并且进行修改X和Y的值,在修改之后,一个IF语句判定是不是X>Y,如果是,则此时pthread_cond_signal()函数会唤醒第一个线程 ,并在下一句中释放互斥量mut。然后第一个线程开始从pthread_cond_wait()执行,首先要再次锁mut , 如果锁成功,再进行条件的判断 (至于为什么用WHILE,即在被唤醒之后还要再判断,后面有原因分析),如果满足条件,则被唤醒 进行处理,最后释放互斥量mut 。

pthread_cond_signal   在多处理器上可能同时唤醒多个线程,当你只能让一个线程处理某个任务时,其它被唤醒的线程就需要继续 wait 

pthread_cond_broadcast唤醒全部线程

 

一个线程的例子

#include 
#include
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;}

 

转载地址:https://jadeshu.blog.csdn.net/article/details/109793334 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:GRUB软盘和硬盘启动系统内核
下一篇:C++中new、delete构件三种方式

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月18日 10时22分33秒