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