linux多线程编程


 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

二、什么时候使用多线程?
     当多个任务可以并行执行时,可以为每个任务启动一个线程。

三、线程的创建
     使用pthread_create函数。
  1. #include<pthread.h>   
  2. int pthread_create (pthread_t *__restrict __newthread,//新创建的线程ID   
  3.                __const pthread_attr_t *__restrict __attr,//线程属性   
  4.                void *(*__start_routine) (void *),//新创建的线程从start_routine开始执行   
  5.                void *__restrict __arg)//执行函数的参数  
返回值:成功-0,失败-返回错误编号,可以用strerror(errno)函数得到错误信息

四、线程的终止
   三种方式
  • 线程从执行函数返回,返回值是线程的退出码
  • 线程被同一进程的其他线程取消
  • 调用pthread_exit()函数退出。这里不是调用exit,因为线程调用exit函数,会导致线程所在的进程退出。

一个小例子:

启动两个线程,一个线程对全局变量num执行加1操作,执行五百次,一个线程对全局变量执行减1操作,同样执行五百次。

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <pthread.h>   
  4. #include <unistd.h>   
  5. #include <string.h>   
  6.   
  7. int num=0;  
  8. void *add(void *arg) {//线程执行函数,执行500次加法   
  9.     int i = 0,tmp;  
  10.     for (; i <500; i++)  
  11.     {  
  12.         tmp=num+1;  
  13.         num=tmp;  
  14.         printf("add+1,result is:%d\n",num);  
  15.     }  
  16.     return ((void *)0);  
  17. }  
  18. void *sub(void *arg)//线程执行函数,执行500次减法   
  19. {  
  20.     int i=0,tmp;  
  21.     for(;i<500;i++)  
  22.     {  
  23.         tmp=num-1;  
  24.         num=tmp;  
  25.         printf("sub-1,result is:%d\n",num);  
  26.     }  
  27.     return ((void *)0);  
  28. }  
  29. int main(int argc, char** argv) {  
  30.       
  31.     pthread_t tid1,tid2;  
  32.     int err;  
  33.     void *tret;  
  34.     err=pthread_create(&tid1,NULL,add,NULL);//创建线程   
  35.     if(err!=0)  
  36.     {  
  37.         printf("pthread_create error:%s\n",strerror(err));  
  38.         exit(-1);  
  39.     }  
  40.     err=pthread_create(&tid2,NULL,sub,NULL);  
  41.     if(err!=0)  
  42.     {  
  43.         printf("pthread_create error:%s\n",strerror(err));  
  44.          exit(-1);  
  45.     }  
  46.     err=pthread_join(tid1,&tret);//阻塞等待线程id为tid1的线程,直到该线程退出   
  47.     if(err!=0)  
  48.     {  
  49.         printf("can not join with thread1:%s\n",strerror(err));  
  50.         exit(-1);  
  51.     }  
  52.     printf("thread 1 exit code %d\n",(int)tret);  
  53.     err=pthread_join(tid2,&tret);  
  54.     if(err!=0)  
  55.     {  
  56.         printf("can not join with thread1:%s\n",strerror(err));  
  57.         exit(-1);  
  58.     }  
  59.     printf("thread 2 exit code %d\n",(int)tret);  
  60.     return 0;  
  61. }  
使用g++编译该文件(g++ main.cpp -o main)。此时会报错undefined reference to `pthread_create'。


报这个错误的原因是:pthread库不是linux默认的库,所以在编译时候需要指明libpthread.a库。

解决方法:在编译时,加上-lpthread参数。

执行结果:


乍一看,结果是对的,加500次,减500次,最后结果为0。但是仔细看所有的输出,你会发现有异样的东西。


    导致这个不和谐出现的原因是,两个线程可以对同一变量进行修改。假如线程1执行tmp=50+1后,被系统中断,此时线程2对num=50执行了减一操作,当线程1恢复,在执行num=tmp=51。而正确结果应为50。所以当多个线程对共享区域进行修改时,应该采用同步的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值