int a; 一个线程写a,另一线程读a,如果不加锁,果然出现写了一半,读了一半的情况!

Posted iw1210

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了int a; 一个线程写a,另一线程读a,如果不加锁,果然出现写了一半,读了一半的情况!相关的知识,希望对你有一定的参考价值。

int  a; 一个线程写a,另一线程读a,如果不加锁,果然出现写了一半,读了一半的情况!

比如写线程里两条语句

a = 2;
a = 3;

在执行完 a = 2 还没执行 a = 3 完时,读线程去读a,读到的有可能就不是2!!!


直接上个例子(test.c):

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

#define      MAXVAL      (~0)
#define      STARTVAL      (MAXVAL-5)

#define       NUMTHR       10

#define      LOCK(mutex)        //pthread_mutex_lock(&(mutex))
#define      UNLOCK(mutex)      //pthread_mutex_unlock(&(mutex));


pthread_mutex_t           mtx;
int                       flag = 1;
unsigned int                a = STARTVAL;


static void  treadfun(void)

        while(flag)
       
                LOCK(mtx);
                        if(MAXVAL == a)
                                a = STARTVAL;
                        else
                                a++;
                UNLOCK(mtx);
       

        return;


int main()

        int  i;
    unsigned int   n;
        pthread_t        tid[NUMTHR];

        printf("MAXVAL = %u, STARTVAL = %u\\n", MAXVAL, STARTVAL);

        pthread_mutex_init(&mtx, NULL);

        for(i=0; i < NUMTHR; i++)
       
                if(0 != pthread_create(&tid[i],NULL,(void *)treadfun,NULL))
               
                        fprintf(stderr,"Create thread error!\\n");
                        return -1;
               
       

        while(1)
       

         LOCK(mtx);
        //assert(STARTVAL <= a && a <= MAXVAL );   //  不加锁时,如果把这句打开,程序就会崩溃退出。
        if(a < STARTVAL || a > MAXVAL)
        
            printf("a = %u\\n", a);
            UNLOCK(mtx);
            break;
        
        UNLOCK(mtx);
       

    flag = 0;
       
        for(i=0; i < NUMTHR; i++)
        pthread_join(tid[i],NULL);

        pthread_mutex_destroy(&mtx);

        printf("end.\\n");

        return 0;



执行结果:

MAXVAL = 4294967295, STARTVAL = 4294967290
a = 856431
end.


注意:a的值距离 MAXVAL 和 STARTVAL 甚远。

如果把两个锁定义打开(下面),程序就不会退出终止。

#define      LOCK(mutex)           pthread_mutex_lock(&(mutex))
#define      UNLOCK(mutex)     pthread_mutex_unlock(&(mutex));



以上是关于int a; 一个线程写a,另一线程读a,如果不加锁,果然出现写了一半,读了一半的情况!的主要内容,如果未能解决你的问题,请参考以下文章

ReentrantReadWriteLock锁例子

消息队列

Delphi 高效读写锁

Java学习笔记---多线程同步的五种方法

ReentrantReadWriteLock 读写锁分析

浅谈Java三种实现线程同步的方法