pthread RWlock 问题
pthread RWlock quesion
我用的是翻译器,因为我英文不好
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <fcntl.h>
#include <unistd.h>
pthread_rwlock_t R_Lock;
int ac=0;
void* RD_LOCK(void* arg) {
pthread_rwlock_rdlock(&R_Lock);
printf("%d\n",ac); // ac is global variable 0
sleep(1);
pthread_rwlock_unlock(&R_Lock);
}
void* WR_LOCK(void* arg) {
pthread_rwlock_wrlock(&R_Lock);
printf("RW LCOK\n");
ac++;
printf("%d\n",ac);
sleep(1);
pthread_rwlock_unlock(&R_Lock);
}
void DO_RW_LCOK(){
pthread_t RW[3];
pthread_rwlock_init(&R_Lock, NULL);
pthread_create(&RW[0], NULL, RD_LOCK,NULL); //==0 thread
pthread_create(&RW[1], NULL, RD_LOCK,NULL); //==1 thread
pthread_create(&RW[2], NULL, WR_LOCK,NULL); //==2 thread
pthread_rwlock_destroy(&R_Lock);
for(int i=0; i<3;i++)
pthread_join(RW[i],NULL);
}
int main(){
DO_RW_LCOK();
return 0;
}
void* RD_LOCK(void* arg) {
pthread_rwlock_rdlock(&R_Lock);
printf("%d\n",ac); // ac is global variable 0
sleep(1);
pthread_rwlock_unlock(&R_Lock); }
void* WR_LOCK(void* arg) {
pthread_rwlock_wrlock(&R_Lock);
ac++;
printf("%d\n",ac);
sleep(1);
pthread_rwlock_unlock(&R_Lock);
}
int main(){
DO_RW_LOCK();
return 0;
}
我尝试执行 3 个线程。
0,1 个线程使用了 readlock,2 个线程使用了 writelcok。
我在程序后的预测运行s 在0,1线程之后,执行了2线程。
然而,运行顺序是2thread,0thread,1thread
我不明白这个。
线程总是不可预测的。因此顺序可能真的会发生变化并且出乎意料。
为了保证您的线程按您希望的顺序运行,请添加一个等待选项,如果其他线程未完成,该选项将使线程等待。只需使用等待和通知。
我不知道你使用的是哪种线程类型,但这是一个伪代码。
Lock waitAndNotify;
int rdDone = 0;
void* RD_LOCK(void* arg) {
pthread_rwlock_rdlock(&R_Lock);
rdDone++;
notify(waitAndNotify);
printf("%d\n",ac); // ac is global variable 0
sleep(1);
pthread_rwlock_unlock(&R_Lock); }
void* WR_LOCK(void* arg) {
pthread_rwlock_wrlock(&R_Lock);
if(rdDone!=2)
wait(waitAndNotify);
ac++;
printf("%d\n",ac);
sleep(1);
pthread_rwlock_unlock(&R_Lock);
}
我用的是翻译器,因为我英文不好
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <fcntl.h>
#include <unistd.h>
pthread_rwlock_t R_Lock;
int ac=0;
void* RD_LOCK(void* arg) {
pthread_rwlock_rdlock(&R_Lock);
printf("%d\n",ac); // ac is global variable 0
sleep(1);
pthread_rwlock_unlock(&R_Lock);
}
void* WR_LOCK(void* arg) {
pthread_rwlock_wrlock(&R_Lock);
printf("RW LCOK\n");
ac++;
printf("%d\n",ac);
sleep(1);
pthread_rwlock_unlock(&R_Lock);
}
void DO_RW_LCOK(){
pthread_t RW[3];
pthread_rwlock_init(&R_Lock, NULL);
pthread_create(&RW[0], NULL, RD_LOCK,NULL); //==0 thread
pthread_create(&RW[1], NULL, RD_LOCK,NULL); //==1 thread
pthread_create(&RW[2], NULL, WR_LOCK,NULL); //==2 thread
pthread_rwlock_destroy(&R_Lock);
for(int i=0; i<3;i++)
pthread_join(RW[i],NULL);
}
int main(){
DO_RW_LCOK();
return 0;
}
void* RD_LOCK(void* arg) {
pthread_rwlock_rdlock(&R_Lock);
printf("%d\n",ac); // ac is global variable 0
sleep(1);
pthread_rwlock_unlock(&R_Lock); }
void* WR_LOCK(void* arg) {
pthread_rwlock_wrlock(&R_Lock);
ac++;
printf("%d\n",ac);
sleep(1);
pthread_rwlock_unlock(&R_Lock);
}
int main(){
DO_RW_LOCK();
return 0;
}
我尝试执行 3 个线程。
0,1 个线程使用了 readlock,2 个线程使用了 writelcok。
我在程序后的预测运行s 在0,1线程之后,执行了2线程。
然而,运行顺序是2thread,0thread,1thread
我不明白这个。
线程总是不可预测的。因此顺序可能真的会发生变化并且出乎意料。 为了保证您的线程按您希望的顺序运行,请添加一个等待选项,如果其他线程未完成,该选项将使线程等待。只需使用等待和通知。 我不知道你使用的是哪种线程类型,但这是一个伪代码。
Lock waitAndNotify;
int rdDone = 0;
void* RD_LOCK(void* arg) {
pthread_rwlock_rdlock(&R_Lock);
rdDone++;
notify(waitAndNotify);
printf("%d\n",ac); // ac is global variable 0
sleep(1);
pthread_rwlock_unlock(&R_Lock); }
void* WR_LOCK(void* arg) {
pthread_rwlock_wrlock(&R_Lock);
if(rdDone!=2)
wait(waitAndNotify);
ac++;
printf("%d\n",ac);
sleep(1);
pthread_rwlock_unlock(&R_Lock);
}