0

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);

那是我的不理解。

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

为我糟糕的英语道歉!

4

1 回答 1

0

的 A版本更快,因为您只需要获取一次锁(无论如何您都需要获取一次写锁)。此外,返回的大小将是最新的(在push时),因为没有其他线程可以同时访问队列。

如果你这样做B ,你可能会得到一个不同的大小答案(如你所指出的),但是,一旦你释放锁(在任何一种情况下),size变量总是可以保持陈旧的值(一个线程可能在你更新队列时)想要使用size)中的值

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

于 2012-06-21T15:57:10.960 回答