当多个线程共享同一数据变量时候,如果我们只是读,不写,那不会有脏数据的问题;如果我们既读又写,但是我们的读写操作总能在一个存储周期之内完成,那么也不会有脏数据的问题。但是,我们大部分情况下都是又读又写,并请每个操作还不是在一个存储周期内完成,想想看,比如:线程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.一个线程锁了之后,忘记解锁,那也肯定出问题