#include #include #include #include #include using namespace std ; // An atomic counter atomic atomic_counter(0); // A non-atomic counter for comparison int non_atomic_counter = 0; void increment_atomic_counter() { for (int i1 = 0; i1 < 100000; ++i1) { atomic_counter++; // Atomic increment } } void increment_non_atomic_counter() { mutex mutexObj ; for (int i1 = 0; i1 < 100000; ++i1) { mutexObj.lock() ; non_atomic_counter++; // Non-atomic increment mutexObj.unlock() ; } } int main() { vector threads; // Test with atomic counter cout << "Testing atomic counter..." << endl; for (int i = 0; i < 10; ++i) { threads.push_back(thread(increment_atomic_counter)); } for (auto& t : threads) { t.join(); } cout << "Atomic counter final value: " << atomic_counter << endl; // Expected: 10 * 100000 = 1000000 // Reset and test with non-atomic counter threads.clear(); cout << "\nTesting non-atomic counter..." << endl; for (int i = 0; i < 10; ++i) { threads.push_back(thread(increment_non_atomic_counter)); } for (auto& t : threads) { t.join(); } cout << "Non-atomic counter final value: " << non_atomic_counter << endl; // Likely less than 1000000 due to race conditions return 0; }