当前位置: 技术问答>linux和unix
很简单的多线程互斥,刚接触请教大家
来源: 互联网 发布时间:2016-04-03
本文导语: 我的程序是多线程模式,多个线程要对 全局变量 :iplist (该变量是链表的头指针,struct ipnode * iplist) 访问,每个线程通过全局变量iplist 获得链表的头指针,然后对链表的节点进行相应的读写操作,该如何实...
我的程序是多线程模式,多个线程要对 全局变量 :iplist (该变量是链表的头指针,struct ipnode * iplist) 访问,每个线程通过全局变量iplist 获得链表的头指针,然后对链表的节点进行相应的读写操作,该如何实现对链表的互斥操作呢? 刚学这块,不是很清楚,请大家给个方法!
|
#include
#include
#include
pthread_mutex_t mutex;
int i = 0;
void * child1(void *arg)
{
while(1)
{
printf("-----thread 1 pthread_mutex_lock returns %dn", pthread_mutex_lock(&mutex));
i++;
sleep(1);
printf("-----thread1 pthread_mutex_unLock returns %dn", pthread_mutex_unlock(&mutex));
sleep(1);
}
}
void *child2(void *arg)
{
while(1)
{
printf("thread 2 pthread_mutex_lock returns %dn", pthread_mutex_lock(&mutex));
i++;
sleep(1);
printf("thread 2 pthread_mutex_unLock returns %dn", pthread_mutex_unlock(&mutex));
sleep(1);
}
}
int main(void)
{
int tid1,tid2;
printf("hello, condition variable testn");
pthread_mutex_init(&mutex,NULL);
pthread_create(&tid1,NULL,child1,NULL);
pthread_create(&tid2,NULL,child2,NULL);
sleep(20);
pthread_exit(0);
}
|
pthread_mutex_t mylock;
pthread_mutex_init(&mylock);
pthread_mutex_lock(&mylock);
pthread_mutex_unlock(&mylock);
首先声明,然后初始化。
在要加锁的地方调用lock和unlock函数
加pthread.h头文件
编译加-lpthread选项
|
这种需求,用读写锁更好些。
|
很好!
锁占内核资源,数量太多了会开销大。折中方案:N个结点共享1把锁,共K个锁,每个结点hash到其中1把锁上。
|
用互斥锁
|
可以根据需要对整个链表进行原子操作或者为了提高性能对链表中的单个节点都加上读写锁,当然具体的实现代码就没有办法像7楼那位大哥那么牛了,但是也不会很复杂。
|
内核有三种锁:信号量,semphore,自旋锁,mutex,
mutex有逐步替代sem的趋势,我认为。
而自旋锁会等待,禁止在硬中断内使用。
mutex有逐步替代sem的趋势,我认为。
而自旋锁会等待,禁止在硬中断内使用。
|
注意处理尽量函数化。
处理得不好容易死锁。
处理得不好容易死锁。
|
很危险。
|
原子操作
|
http://topic.csdn.net/u/20080611/19/654568a7-9a02-4369-a310-3931417981af.html#
|
mark
|
来晚了,该说的楼上都说了,看来分没我份...
|
很详细,我就不说了
|
|
7楼是做什么的,好像什么都会。
|
这位兄台如何使用原子操作来对一个链表进行互斥?可否详细讲解一下。
|
Linux下:pthread_mutex_t
Windows下:CRITICAL_SECTION
Windows下:CRITICAL_SECTION
|
Linux下用互斥锁,Windows下用关键区。
7楼看头像就是猛人啊:-)
7楼看头像就是猛人啊:-)
|
7楼是挺猛的!佩服!
|
同问,有代码实例吗?