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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月18日 10时22分33秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
浅析:正则表达式修改字符串数字“10000”为“10,000”
2019-04-30
浅析chrome新特性,追溯源头至HSTS
2019-04-30
记一次曲折的Debug经历
2019-04-30
Impala支持Google云存储开发笔记
2019-04-30
如何在Apache JIRA中搜索issue
2019-04-30
Impala-shell相关源码笔记
2019-04-30
Windows下配置Storm源码阅读环境(vim+ctags)
2019-04-30
Storm源码细读——Nimbus启动
2019-04-30
Storm源码细读——Supervisor启动
2019-04-30
scrapy 排错记录
2019-04-30
Titan线程隔离的验证
2019-04-30
Titan源码阅读——如何透明地支持多线程事务隔离
2019-04-30
HDOJ 2578 Dating with girls(1)
2019-04-30
HDOJ 2199 Can you solve this equation?
2019-04-30
uva725 - Division
2019-04-30
HDOJ1238 Substrings
2019-04-30
ACM路上的一大失误
2019-04-30
CodeForces 628A Tennis Tournament
2019-04-30
HDOJ2049 不容易系列之(4)——考新郎
2019-04-30