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

本文通过一个C语言示例程序展示了在线程间共享变量时,如果不使用锁机制可能会导致的数据不一致问题。实验中,多个线程对全局变量进行递增操作,主程序周期性检查该变量是否超出预设范围。当去掉锁机制后,出现了预期外的值,说明存在竞态条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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));



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值