Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一个写操作和一个读操作:使用一个wrlock两个VS一个rdlock读操作和一个wrlock写操作?_C++_Pthreads - Fatal编程技术网

C++ 一个写操作和一个读操作:使用一个wrlock两个VS一个rdlock读操作和一个wrlock写操作?

C++ 一个写操作和一个读操作:使用一个wrlock两个VS一个rdlock读操作和一个wrlock写操作?,c++,pthreads,C++,Pthreads,A和B,哪个更好或更快 那是我不理解的 任何信息或建议对我都有很大帮助 为我糟糕的英语道歉 您的A版本更快,因为您只需要在需要以任何速率获取一次写锁的情况下获取一次锁。此外,返回的大小将是推送时的最新大小,因为没有其他线程可以同时访问队列 如果您选择B,您可能会得到一个不同的关于大小的答案,正如您所指出的,但是,一旦您在任何一种情况下释放了锁,那么大小变量总是可以保存过时的值。在您想要使用大小中的值时,线程可能已经更新了队列 此外,读者应在受保护部分内查询队列的大小,以避免队列为空时出现异常谢谢

A和B,哪个更好或更快

那是我不理解的

任何信息或建议对我都有很大帮助

为我糟糕的英语道歉

您的A版本更快,因为您只需要在需要以任何速率获取一次写锁的情况下获取一次锁。此外,返回的大小将是推送时的最新大小,因为没有其他线程可以同时访问队列

如果您选择B,您可能会得到一个不同的关于大小的答案,正如您所指出的,但是,一旦您在任何一种情况下释放了锁,那么大小变量总是可以保存过时的值。在您想要使用大小中的值时,线程可能已经更新了队列


此外,读者应在受保护部分内查询队列的大小,以避免队列为空时出现异常

谢谢。我从你有用的答案中得到一些信息:1。获取锁很重可能是它的自旋锁包装器的系统调用?反对几次流行音乐还是推?2.没有实际的环境,没有人会更好?关于STL,我想知道为什么不直接使用std::deque::size而不使用lock它可能只是{return std::dequeue::internal_var_length;},对吗?实际上,我正在写一个线程池,有链接或建议吗?再次感谢。@HenryLee-在线程环境中访问内存位置以进行读取,而在该环境中,其他线程可以对同一内存位置进行写入,这通常是未定义的行为,尽管这取决于所使用的线程内存模型
std::deque<Myclass> queue;
... // do something
std::size_t size = 0;
... // create n threads, one push queue and others pop queue.

// a thread do below
#ifdef A
pthread_rwlock_wrlock(&rwlock);
queue.push_front(myobj);
size = queue.size();
pthread_rwlock_unlock(&rwlock);
#endif

#ifdef B
pthread_rwlock_wrlock(&rwlock);
queue.push_front(myobj); 
pthread_rwlock_unlock(&rwlock);
// if there is some operation,
// I think this B is better,
// because I should get the newest size.
pthread_rwlock_rdlock(&rwlock);
size = queue.size();
pthread_rwlock_unlock(&rwlock);
#endif

// other threads do below
pthread_rwlock_wrlock(&rwlock);
queue.pop_back(); 
pthread_rwlock_unlock(&rwlock);