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

时间:2012-06-21 15:51:07

标签: c++ pthreads

更好还是更快,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);

这是我不理解的。

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

为我可怜的英语道歉!

1 个答案:

答案 0 :(得分:0)

您的 A 版本更快,因为您只需要获取一次锁定(您需要以任何速率获取一次写入锁定)。此外,返回的大小将是 latest (在 push 时),因为没有其他线程可以同时访问队列。

如果您执行 B ,您可能会得到 size 的不同答案(如您所述),但是,一旦释放锁定(在任一情况下){ {1}}变量始终可以保持过时值(线程可能已经在您使用 size中的值时更新了队列)

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