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);
}