读写锁 优先级 linux,Linux下pthread的读写锁的优先级问题

这篇博客演示了一个使用pthread库实现多线程同步的例子,涉及pthread_barrier和pthread_rwlock。代码中创建了三个线程,通过读写锁和屏障进行协调,确保线程间的正确执行顺序。线程1和2在屏障处等待,线程3可能进行读写操作。当特定条件满足时,线程会获取读写锁并打印信息。
摘要由CSDN通过智能技术生成

#include

#include

#include

#include

static pthread_barrier_t barr;

static pthread_barrier_t barr2;

static pthread_rwlock_t rwlock;

void * thr1_entry(void *arg){

int threadCount=*(int*)arg;

std::cout<

if(pthread_rwlock_rdlock(&rwlock)!=0)

return NULL;

std::cout<

{int rc=pthread_barrier_wait(&barr);

if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) {

printf("Could not wait on barrier\n");

}}

std::cout<

int rc=pthread_barrier_wait(&barr2);

if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) {

printf("Could not wait on barrier\n");

}

std::cout<

}

void * thr2_entry(void *arg){

int threadCount=*(int*)arg;

std::cout<

if(threadCount!=1){int rc=pthread_barrier_wait(&barr);

if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) {

printf("Could not wait on barrier\n");

}}

if(threadCount==1){

if(pthread_rwlock_rdlock(&rwlock)!=0)

return NULL;

std::cout<

{int rc=pthread_barrier_wait(&barr);

if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) {

printf("Could not wait on barrier\n");

}}

} else if(threadCount==2){

pthread_rwlock_wrlock(&rwlock);

} else if(threadCount==3){

while(true){

sleep(5);

pthread_rwlock_rdlock(&rwlock);

std::cout<

pthread_rwlock_unlock(&rwlock);

std::cout<

}

}

std::cout<

int rc=pthread_barrier_wait(&barr2);

if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) {

printf("Could not wait on barrier\n");

}

std::cout<

}

int main(int argc,char* argv[]){

pthread_t thr1,thr2,thr3;

if(pthread_barrier_init(&barr, NULL, 3)) {

printf("Could not create a barrier\n");

return -1;

}

if(pthread_barrier_init(&barr2, NULL, 3)) {

printf("Could not create a barrier\n");

return -1;

}

pthread_rwlockattr_t attr;

if(pthread_rwlockattr_init(&attr)){

printf("Could not create a rwlock attr\n");

return -1;

}

// int perf=-1;

//pthread_rwlockattr_getkind_np(&attr,&perf);

// std::cout<

pthread_rwlockattr_setkind_np(&attr,PTHREAD_RWLOCK_PREFER_WRITER_NP);

if(pthread_rwlock_init(&rwlock,&attr)){

printf("Could not create a rwlock\n");

return -1;

}

int threadCount[]={1,2,3};

if(pthread_create(&thr1, NULL, &thr1_entry, (void*)&threadCount[0])) {

printf("Could not create thread %d\n", threadCount);

return -1;

}

if(pthread_create(&thr2, NULL, &thr2_entry, (void*)&threadCount[1])) {

printf("Could not create thread %d\n", threadCount);

return -1;

}

if(pthread_create(&thr3, NULL, &thr2_entry, (void*)&threadCount[2])) {

printf("Could not create thread %d\n", threadCount);

return -1;

}

pthread_join(thr1,NULL);

pthread_join(thr2,NULL);

pthread_join(thr3,NULL);

pthread_barrier_destroy(&barr);

pthread_rwlock_destroy(&rwlock);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值