单读者写者(一个读者一个写者)问题为何要加锁

来源:互联网 发布:王泽鉴天龙八部知乎 编辑:程序博客网 时间:2024/05/17 01:44

http://bbs.csdn.net/topics/390248385 提出了一个问题:“一个线程读数据,一个线程写数据,要加锁?”并给出结论说不需要加锁。

不论作者水平如何,总会有很多人也都在想这个问题。

问题中给出了这样一个例子:

全局变量int g_val;

线程1

printf("%d",g_val);


线程2

g_val++;

在这个例子里,可以不加锁。因为这个g_val影响很小。

实际应用中,假设线程2每10秒执行一次,线程1作为显示线程2执行次数的计数器,每60秒执行一次,就可能出现线程2执行了11次,但是显示只有10次的情况。

次数多少可能不会造成重大影响。对例子做一定的修改如下:


int *g_val;

void Thread1()
{
    while(1)
    {
        //打印g_val数据
        printf("%d",*g_val);  //p1
        msleep(300);
    }
}

void Thread2()
{
    while(1)
    {
        //修改g_val数据

        if(g_val!=NULL)
        {
            delete []g_val;  
            g_val=NULL;
            msleep(100);  //1
            g_val = new int(10000);
        }
        msleep(1);
    }
}

这种例子下,如果Thread2在执行1,而Thread1在执行p1那句话,程序跑着跑着可能就崩了。

所以,单个读者单个写者也是要做互斥保护的!



0 0
原创粉丝点击