Linux--多线程(2)--多线程并发
创始人
2025-05-29 05:11:16

一、创建五个线程,分别打印出自己是第几个被创建出来的

1.创建五个线程,每个打印三次,主程序等待线程运行完退出。

#include
#include
#include
#include
#includevoid* fun(void*arg)
{int index=*(int*)arg;//for(int i=0;i<3;i++){printf("inex=%d\n",&index);sleep(1);}
}int main()
{pthread_t id[5];int i=0;for(;i<5;i++){pthread_create(&id[i],NULL,fun,(void*)&i);}for(i=0;i<5;i++){pthread_join(id[i],NULL);}exit(0);
}

//运行结果

//按道理应该输出0-4,(也有可能出现0-4)

//还会有其他的结果,

多次输出结果并不唯一

//为什么会出现这样的结果?

i在主线程中一直在被修改

int main()
{
    pthread_t id[5];
    int i=0;
    for(;i<5;i++)
    {
        pthread_create(&id[i],NULL,fun,(void*)&i);
    }
    for(i=0;i<5;i++)//i不断改变
    {
        pthread_join(id[i],NULL);
    }
    exit(0);
}

两次for循环都会改变i的值,所以i才会呈现出上面的结果

 //加入循环的结果

 2.int 1=1;五个线程,每个线程对i++1000次,最后i为几

#include
#include
#include
#include
#includeint m_val=1;void* fun(void* arg)
{int i=0;for(;i<1000;i++){   printf("m_val=%d\n",m_val++);}   
}int main()
{pthread_t id[5];int i=0;for(;i<5;i++){   pthread_create(&id[i],NULL,fun,NULL);}   for(i=0;i<5;i++){   pthread_join(id[i],NULL);}   exit(0);
}

 

//结果有可能最后一个值不是5000,这是为什么?

计算机不能直接执行main.c

 //汇编就是将代码转换为机器指令

//程序由一条条指令构成

//执行vim test2 

 答:一个i++由多条指令组成,(读取i的值;++;写入i的值)

 两个路径同时对i进行++(一个正在+,还没完成,另一个也开始+),那么i的值只+1,最终结果就为4999;

//如果计算机只有一个处理器,那么i为多少?

i=5000

不能进行两个路径同时对i进行++,某一条路径在++的时候,其他的路径等待

会造成什么危害?

如果是减法,卖票可能会出现一张票卖给两个人,

如何解决这个问题

对多线程进行同步;

方法:

信号量:定义一个信号量 值为1,只能有一个抢到资源

互斥锁、条件变量、读写锁

相关内容

热门资讯

父亲经常体罚式管教,法院认定为... (来源:光明日报)转自:光明日报  【案例苑】  ●案情:李芳(化名)与庞镇(化名)原系夫妻,离婚后...
脑机接口临床试验取得新进展 (来源:光明日报)转自:光明日报  【瞧!我们的前沿科技】  本报上海12月19日电 记者颜维琦 通...
东软集团股份有限公司关于获得政... 证券代码:600718 证券简称:东软集团 公告编号:临2025-072东软集团股份有限公司关于获...
南博古画失踪变拍品,提级调查绝...   明代仇英《江南春》图卷从南京博物院“伪作”处置到现身拍卖场,8800万估价与当年6800元售价的...
不得要求或诱导他人拒收现金   尽管“拒收现金违法”观念已深入人心,但拒收现金行为仍难以杜绝。12月19日,中国人民银行等三部门...