Как насчет определения:
def truths(L):
"""Return the elements of L that test true"""
return [x for x in L if x]
Так, например,
> [wife.children for wife in henry8.wives]
[[Mary1], [Elizabeth1], [Edward6], [], [], []]
> truths(wife.children for wife in henry8.wives)
[[Mary1], [Elizabeth1], [Edward6]]
Вам просто нужно удерживать мьютекс, когда вы изменяете переменную _conditionReady
. Это позволяет избежать состояния гонки, гарантируя, что переменная не будет изменена между проверкой ее значения и началом ожидания. Убедитесь, что вы освободили мьютекс до или после вызова notify_one
, чтобы позволить вашему ожидающему потоку активизироваться (если вы сделаете это после вызова notify, вы можете ввести небольшое снижение производительности, вызвав ожидающий поток, а затем сразу же вернуться в спящий режим как мьютекс блокируется перед повторным пробуждением, когда мьютекс разблокирован). напр. :
{
std::unique_lock <std::mutex> lock(_condLoopMutex);
_conditionReady = true;
}
_condLoopCondition.notify_one();
Прежде всего, сон никогда не является решением для ошибок. Он должен действительно генерировать предупреждение компилятора при каждом его использовании, которое передало бы одно и то же сообщение.
Теперь, когда вы изменяете управляющую переменную, охраняемую условием, это следует делать, удерживая мьютекс - обычно тот же, который используется в вашем cond.wait()
. Ваш код этого не делает.