当前位置: 技术问答>linux和unix
互斥访问问题___急用
来源: 互联网 发布时间:2015-11-11
本文导语: 各位朋友: 我最近写了一个多线程程序,其中每个线程都需要修改一个全局变量"struct entry item;"(由于本问题与struct entry的结构无关,所以没有给出struct entry的具体定义),这样就存在一个互斥访问的问题。...
各位朋友:
我最近写了一个多线程程序,其中每个线程都需要修改一个全局变量"struct entry item;"(由于本问题与struct entry的结构无关,所以没有给出struct entry的具体定义),这样就存在一个互斥访问的问题。虽然在操作系统中学过相关的内容,但是从来没有实际运用过,我自己简单的设计了一个变量flag来表示"item是否已经被占用":flag为1表示item已经被占用,本线程不能访问,需要等待;flag为1表示item没有被占用,本线程可以访问。
然后每个线程采用如下逻辑进行互斥访问:
while (!flag)
{
flag = 1;
//处理item,然后break,退出while循环
....
}
但是,这种方法显然存在问题:如果两个线程同时检查flag,那就有可能同时进入while循环当中。在书上看到有所谓的"TestandSet"元操作,即在此元操作中可以检查flag的值,如果flag为0,就将其置为1。但是我不知道linux系统中是否提供了这样的系统调用,所以请各位高手指点一二(也可以给我推荐一些其他的方法),小弟不胜感激!!!!!!!!
我最近写了一个多线程程序,其中每个线程都需要修改一个全局变量"struct entry item;"(由于本问题与struct entry的结构无关,所以没有给出struct entry的具体定义),这样就存在一个互斥访问的问题。虽然在操作系统中学过相关的内容,但是从来没有实际运用过,我自己简单的设计了一个变量flag来表示"item是否已经被占用":flag为1表示item已经被占用,本线程不能访问,需要等待;flag为1表示item没有被占用,本线程可以访问。
然后每个线程采用如下逻辑进行互斥访问:
while (!flag)
{
flag = 1;
//处理item,然后break,退出while循环
....
}
但是,这种方法显然存在问题:如果两个线程同时检查flag,那就有可能同时进入while循环当中。在书上看到有所谓的"TestandSet"元操作,即在此元操作中可以检查flag的值,如果flag为0,就将其置为1。但是我不知道linux系统中是否提供了这样的系统调用,所以请各位高手指点一二(也可以给我推荐一些其他的方法),小弟不胜感激!!!!!!!!
|
如果你不对整个链表做增删操作,在链表里搜索某个表项的操作无需加锁。在你的每个struct里增加一个mutex变量。找到表项以后,把这个表项的锁锁住,修改完后解锁,这样就可以同时修改多个表项。
如果同时还要对整个链表做增删操作,则必须有一个锁对整个链表做保护。为了提高效率,可以根据你的应用的实际情况用读写锁。
如果同时还要对整个链表做增删操作,则必须有一个锁对整个链表做保护。为了提高效率,可以根据你的应用的实际情况用读写锁。
|
man pthread_rwlock_rdlock
|
用 pthread_mutex_t mutex来实现,具体使用请查资料
|
pthread_mutex_init(&mutex,NULL);
pthread_mutex_lock(&mutex);
//处理item,然后break,退出while循环
pthread_mutex_unlock(&mutex);
pthread_mutex_lock(&mutex);
//处理item,然后break,退出while循环
pthread_mutex_unlock(&mutex);
|
用读写锁。
|
典型的读者-写者问题,前几天我刚作了一个类似的程序,不过
是在 windows 上用两个信号量和一个计数器实现的,在 linux
上我还没做过,fierygnu(va_list) 说的pthread_rwlock_rdlock
应该是可用的,自己学习一下就行
是在 windows 上用两个信号量和一个计数器实现的,在 linux
上我还没做过,fierygnu(va_list) 说的pthread_rwlock_rdlock
应该是可用的,自己学习一下就行
|
flag为1表示item已经被占用,本线程不能访问,需要等待;flag为1表示item没有被占用,本线程可以访问。?????
应该是:flag为1表示item已经被占用,本线程不能访问,需要等待;flag为0表示item没有被占用,本线程可以访问。
应该是:flag为1表示item已经被占用,本线程不能访问,需要等待;flag为0表示item没有被占用,本线程可以访问。
|
up
|
赞同楼上的观点,
|
赞同hmaple(hmaple) 的观点
|
hmaple(hmaple) 乖乖,好