天天看点

线程---线程同步

当多个线程共享同一数据变量时候,如果我们只是读,不写,那不会有脏数据的问题;如果我们既读又写,但是我们的读写操作总能在一个存储周期之内完成,那么也不会有脏数据的问题。但是,我们大部分情况下都是又读又写,并请每个操作还不是在一个存储周期内完成,想想看,比如:线程1现在要写,并且这个写要占三个存储周期,就在线程1写完1/3,即一个存储周期的时候,这个时候也不知道写的什么,也不知道到底有没有写进去,然后,线程2插进来了,要读这个变量,那就读,读出来什么就不知道,这就是典型的读脏数据。由线程不同步引起怎么办?

非常简单的道理,线程1在写的时候,其它线程给我等着,等到线程1写完为止

手头也没什么简单的例子,就随手写一个简单的样板

#include <stdio.h>

#include <pthread.h>

int global_value=0;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *thr_fn1(void *arg)

{

        pthread_mutex_lock(&mutex);

        global_value=555;

        pthread_mutex_unlock(&mutex);

        return((void *)1);

}

void *thr_fn2(void *arg)

{    

        if(global_value==555) { printf("5555555555\n"); }

        pthread_exit((void *)1);

int main(void)

        int                 err;

        pthread_t     tid1, tid2;

        void                *tret;

        err = pthread_create(&tid1, NULL, thr_fn1, NULL);

        err = pthread_create(&tid2, NULL, thr_fn2, NULL);

        err = pthread_join(tid1, NULL);

        err = pthread_join(tid2, NULL);

            //当对线程的返回值不感兴趣时,置为NULL

        exit(0);

其实,在这个程序完全没必要用上同步锁,只是为了演示一下怎么用

当然,同步锁还有很多别的方法,本人用的也就基本上这么简单啦

关于死锁的问题,还是说下

1.在同一线程里面连续锁两次,肯定死翘

2.锁了之后,进行操作的时间无限长,连解锁都没机会,其实这跟锁没关系,是程序的问题,但还是提一下

3.一个线程锁了之后,忘记解锁,那也肯定出问题

继续阅读