您的位置:首页 > 理论基础 > 计算机网络

企业网络面临的威胁----视频下载

2010-04-04 17:26 211 查看
当多个线程共享同一数据变量时候,如果我们只是读,不写,那不会有脏数据的问题;如果我们既读又写,但是我们的读写操作总能在一个存储周期之内完成,那么也不会有脏数据的问题。但是,我们大部分情况下都是又读又写,并请每个操作还不是在一个存储周期内完成,想想看,比如:线程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)
{
pthread_mutex_lock(&mutex);
if(global_value==555) { printf("5555555555\n"); }
pthread_mutex_unlock(&mutex);
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.一个线程锁了之后,忘记解锁,那也肯定出问题
本文出自 “nnssll” 博客,谢绝转载!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: