Так что здесь происходит дурацкий порядок инициализации.
Члены класса создаются в том порядке, в котором они объявлены в классе.В вашем случае это означает сначала вектор подписчиков, затем поток, затем счетчик (!) И, наконец, мьютекс.Порядок, в котором вы указываете инициализаторы в конструкторе, не имеет значения.
Но!Создание объекта потока влечет за собой запуск потока, выполнение его функции.И это, в конце концов, приводит к использованию мьютекса, возможно, до того, как конструктор Producer
достигнет точки, где он фактически его инициализирует.Таким образом, вы заканчиваете тем, что используете еще не сконструированный мьютекс, и (не то, что это является причиной вашей проблемы), а также еще не инициализированный счетчик.
В общем, вы должны быть осторожны, когда у вас естьинициализатор члена, в котором упоминается this
или другой член класса, включая вызов функции-члена.Он устанавливает сцену для доступа к неинициализированному объекту.
В вашем случае достаточно просто переместить элементы мьютекса и счетчика до того, как член потока будет достаточным.