Use an atomic counter when threads only need unique ticket numbers.

Atomic Ticket Counter

atomic_ticket_counter.cpp
#include <atomic>
#include <iostream>
#include <thread>

void takeTicket(std::atomic<int>* nextTicket, int* ticket) {
    *ticket = nextTicket->fetch_add(1);
}

int main() {
    int start = ;
    std::atomic<int> nextTicket(start);
    int firstTicket = 0;
    int secondTicket = 0;

    std::thread first(takeTicket, &nextTicket, &firstTicket);
    std::thread second(takeTicket, &nextTicket, &secondTicket);

    first.join();
    second.join();

    int issued = nextTicket.load() - start;
    std::cout << "start=" << start << std::endl;
    std::cout << "issued=" << issued << std::endl;
    return 0;
}
#include <atomic>
#include <iostream>
#include <thread>

void takeTicket(std::atomic<int>* nextTicket, int* ticket) {
    *ticket = nextTicket->fetch_add(1);
}

int main() {
    int start = ;
    std::atomic<int> nextTicket(start);
    int firstTicket = 0;
    int secondTicket = 0;

    std::thread first(takeTicket, &nextTicket, &firstTicket);
    std::thread second(takeTicket, &nextTicket, &secondTicket);

    first.join();
    second.join();

    int issued = nextTicket.load() - start;
    std::cout << "start=" << start << std::endl;
    std::cout << "issued=" << issued << std::endl;
    return 0;
}
#include <atomic>
#include <iostream>
#include <thread>

void takeTicket(std::atomic<int>* nextTicket, int* ticket) {
    *ticket = nextTicket->fetch_add(1);
}

int main() {
    int start = ;
    std::atomic<int> nextTicket(start);
    int firstTicket = 0;
    int secondTicket = 0;

    std::thread first(takeTicket, &nextTicket, &firstTicket);
    std::thread second(takeTicket, &nextTicket, &secondTicket);

    first.join();
    second.join();

    int issued = nextTicket.load() - start;
    std::cout << "start=" << start << std::endl;
    std::cout << "issued=" << issued << std::endl;
    return 0;
}
atomic `fetch_add` updates the counter as one atomic operation and returns the previous value.
tickets Each worker receives a different ticket without a separate mutex.