当前位置: 技术问答>linux和unix
linux下如何安全地让三个不同线程处理一个全局的链表
来源: 互联网 发布时间:2014-12-13
本文导语: 线程A,线程B和线程C都要对一个全局的链表进行操作 A是把节点加入链表, B是读节点, C是从链表中删节点 要求这三个操作同时进行, 如何安全的实现这个目标呢? 要不要使用互斥,或者是更高级的办法。 望有...
线程A,线程B和线程C都要对一个全局的链表进行操作
A是把节点加入链表,
B是读节点,
C是从链表中删节点
要求这三个操作同时进行,
如何安全的实现这个目标呢?
要不要使用互斥,或者是更高级的办法。
望有经验的兄弟帮我一把
最好能给我看一下例子
拜谢了
A是把节点加入链表,
B是读节点,
C是从链表中删节点
要求这三个操作同时进行,
如何安全的实现这个目标呢?
要不要使用互斥,或者是更高级的办法。
望有经验的兄弟帮我一把
最好能给我看一下例子
拜谢了
|
肯定需要同步,用互斥锁、信号灯都可以
互斥锁的使用
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
可能需要条件变量
pthread_cond_t cond;
pthread_cond_int(&cond,NULL);
pthread_cond_wait(&cond,&mutex);
pthread_cond_signal(&cond);
用信号灯:
semget,semop,semctl
具体man 一下
互斥锁的使用
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
可能需要条件变量
pthread_cond_t cond;
pthread_cond_int(&cond,NULL);
pthread_cond_wait(&cond,&mutex);
pthread_cond_signal(&cond);
用信号灯:
semget,semop,semctl
具体man 一下
|
使用线程互斥
#include
pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutex-
attr);
int pthread_mutex_lock(pthread_mutex_t *mutex));
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
#include
pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutex-
attr);
int pthread_mutex_lock(pthread_mutex_t *mutex));
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
|
to royalier(皇家):
你的那个方法根本就不通,不要误人子弟:
当三个线程同时对flag操作时将会出现不可预测的错误。
建议用互斥锁、信号灯
你的那个方法根本就不通,不要误人子弟:
当三个线程同时对flag操作时将会出现不可预测的错误。
建议用互斥锁、信号灯
|
这个问题应该很简单吧。自己做信号量就可以了!链表中设置一个信号量flag。
A是把节点加入链表,在对节点赋值之前,flag=-1。加入链表时flag=1;
当flag=1的时候,B是读节点,读完之后,flag=0;
当flag=0时,C是从链表中删节点,flag=-1;
完成
A是把节点加入链表,在对节点赋值之前,flag=-1。加入链表时flag=1;
当flag=1的时候,B是读节点,读完之后,flag=0;
当flag=0时,C是从链表中删节点,flag=-1;
完成