Я знаю, что std :: queue не является потокобезопасным, но я не хочу блокировать очередь. поэтому я использую pop & pu sh limit для использования.
например, когда я хочу pop: у меня есть перечисление express первый элемент статуса
enum {
Busy = 1,
Unused,
}
, когда я добавить элемент в очередь:
void UserAdd() {
lock.lock();
element.status = BUSY;
queue.push_back(element);
lock.unlock();
}
при посещении:
//only visit function, and every element only called once.
void UserVisit() {
auto header = queue.front();
.......
queue.front().status = UNUSED;
return ;
}
Я оцениваю статус первых элементов, когда хочу всплыть элемент.
Если первый элемент Занят, подождите;
Если первый элемент не используется, выведите:
void UserPop() {
while (queue.front().status != Unused) {
usleep(200);
}
lock.lock();
queue.pop();
lock.unlock();
}
поток A: 1. UserAdd, 2. UserVisit, 1.UserAdd, 2.UserVisit l oop. ..
поток B: 1. UserPop.
Безопасен ли поток UserPop () && UserVisit?.
Я думаю, что это безопасно для потока.