Linux--多线程(2)--多线程并发

文章讨论了在多线程环境下,共享变量的并发访问可能导致的非预期结果。通过示例展示了线程安全问题,如线程打印顺序的不确定性以及并发增加计数器时可能出现的最终值不正确。提出了使用同步机制,如信号量、互斥锁等来解决这类问题。
摘要由CSDN通过智能技术生成

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

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

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>

void* 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<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>

int 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,只能有一个抢到资源

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值