美文网首页
一个简单的线程竟态实例

一个简单的线程竟态实例

作者: 码脑 | 来源:发表于2017-02-22 16:01 被阅读29次

写这个东西完全是初级的东西,给不理解的人看的,理解了请pass...

1.源代码:

#include <stdio.h>
#include <pthread.h>


int critical_var =0;

pthread_mutex_t mutex_c= PTHREAD_MUTEX_INITIALIZER;

void* printf_fn(void *data)
{

        int critical_var_bak=pthread_self();
        while(1){
//pthread_mutex_lock(&mutex_c);
                critical_var = critical_var_bak;
                sleep(1);
                if(critical_var != critical_var_bak){
                        printf("found ...\n");
                        printf("tid:%d critical:%d\n",critical_var_bak,critical_var);
                }
//pthread_mutex_unlock(&mutex_c);
        }

return (void*)NULL;

}


int main()
{

        pthread_t tid1,tid2;
        pthread_create(&tid1,NULL,printf_fn,NULL);
        pthread_create(&tid2,NULL,printf_fn,NULL);


        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);

        return 0;

}

2.编译运行

gcc pthread_test.c -o pthread_test -g -lpthread

打印:
found ...
tid:-1328888064 critical:-1337280768
found ...
tid:-1337280768 critical:-1328888064
found ...
tid:-1328888064 critical:-1337280768
found ...
tid:-1337280768 critical:-1328888064
found ...
tid:-1328888064 critical:-1337280768
found ...
tid:-1337280768 critical:-1328888064

很明显的可以看出来 critial的变量在线程切换的时候改变了状态。

  1. 如果打开互斥锁(//pthread_mutex_lock(&mutex_c);),就完全可以避免了此类问题。改一下 printf_fn
void* printf_fn(void *data)
{

        int critical_var_bak=pthread_self();
        while(1){
pthread_mutex_lock(&mutex_c);
                critical_var = critical_var_bak;
                sleep(1);
                if(critical_var != critical_var_bak){
                        printf("found ...\n");
                        printf("tid:%d critical:%d\n",critical_var_bak,critical_var);
                }
pthread_mutex_unlock(&mutex_c);
        }

return (void*)NULL;

}

4.重新编译运行

5.结果没有critical的打印了。

相关文章

  • 一个简单的线程竟态实例

    写这个东西完全是初级的东西,给不理解的人看的,理解了请pass... 1.源代码: 2.编译运行 打印:found...

  • Threadlocal 记事

    Threadlocal 简单介绍: ThreadLocal的实例代表了一个线程局部的变量,每条线程都只能看到自己的...

  • python之多进程

    实例一:一个简单的多进程实例,要创建进程,需要motiproceing模块。用法和创建线程的差不多。这个程序,实现...

  • JavaEE进阶知识学习----多线程JUC高级知识-5-线程池

    11.线程池 先看一个简单的实例 上面我们就是创建和销毁了三个线程实例,这样不断的创建和销毁,就会消耗资源,于是就...

  • 并发编程

    1、什么是线程安全,怎么保证线程安全? 线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现...

  • Java多线程

    在java中,多线程一直是代表着高级 线程安全性 线程安全需要考虑操作的自己状态的原子性,竟态条件,复合操作 保证...

  • redis-API-全局命令

    单线程架构 纯内存 非阻塞i/o 单线程避免了线程切换和竟态产生的消耗 概要: 使用多路复用技术 全局命令 查看所...

  • 4.线程的状态和系统滴答时钟2020-04-28

    1.线程在五种状态下切换:初始态 就绪态 运行态 挂起态 关闭态 一个时间内只允许一个线程运行 2.系统心跳时钟 ...

  • 进程、线程、协程

    进程:正在运行的程序实例,是对资源管理的集合线程:系统调度的最小单位,是对执行指令的集合协程:用户态的线程,主动的...

  • 线程锁的使用

    方式一:对该类CLASSA加线程锁,缺点:该类生成的实例共享一个线程锁,因此实例a、实例b、实例c在执行该方法时,...

网友评论

      本文标题:一个简单的线程竟态实例

      本文链接:https://www.haomeiwen.com/subject/mqdmwttx.html