更好还是更快,A或B?
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);
这是我不理解的。
任何信息或建议都对我有很大的帮助!
为我可怜的英语道歉!
答案 0 :(得分:0)
您的 A 版本更快,因为您只需要获取一次锁定(您需要以任何速率获取一次写入锁定)。此外,返回的大小将是 latest (在 push 时),因为没有其他线程可以同时访问队列。
如果您执行 B ,您可能会得到 size 的不同答案(如您所述),但是,一旦释放锁定(在任一情况下){ {1}}变量始终可以保持过时值(线程可能已经在您使用 size
中的值时更新了队列)
此外,读者应该查询队列的大小(在受保护的部分内),以避免在队列为空时发生异常