Concurrency and Source Panels
Atomic Ticket Counter
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.