mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-23 02:05:57 +01:00
cpp: move atomic from cpp-cheat
This commit is contained in:
@@ -11791,7 +11791,10 @@ The implementation lives under `libgomp` in the GCC tree, and is documented at:
|
|||||||
|
|
||||||
Programs under link:userland/cpp/[] are examples of link:https://en.wikipedia.org/wiki/C%2B%2B#Standardization[ISO C] programming.
|
Programs under link:userland/cpp/[] are examples of link:https://en.wikipedia.org/wiki/C%2B%2B#Standardization[ISO C] programming.
|
||||||
|
|
||||||
|
* link:userland/cpp/empty.cpp[]
|
||||||
* link:userland/cpp/hello.cpp[]
|
* link:userland/cpp/hello.cpp[]
|
||||||
|
* `<atomic>` 32 "Atomic operations library"
|
||||||
|
** link:userland/cpp/atomic.cpp[]
|
||||||
|
|
||||||
=== POSIX
|
=== POSIX
|
||||||
|
|
||||||
|
|||||||
52
userland/cpp/atomic.cpp
Normal file
52
userland/cpp/atomic.cpp
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
// https://github.com/cirosantilli/linux-kernel-module-cheat#atomic
|
||||||
|
//
|
||||||
|
// More restricted than mutex as it can only protect a few operations on integers.
|
||||||
|
//
|
||||||
|
// But if that is the use case, may be more efficient.
|
||||||
|
//
|
||||||
|
// On GCC 4.8 x86-64, using atomic is a huge peformance improvement
|
||||||
|
// over the same program with mutexes (5x).
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <thread>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
std::atomic_ulong my_atomic_ulong(0);
|
||||||
|
unsigned long my_non_atomic_ulong = 0;
|
||||||
|
size_t niters;
|
||||||
|
|
||||||
|
void threadMain() {
|
||||||
|
for (size_t i = 0; i < niters; ++i) {
|
||||||
|
my_atomic_ulong++;
|
||||||
|
my_non_atomic_ulong++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
size_t nthreads;
|
||||||
|
if (argc > 1) {
|
||||||
|
nthreads = std::stoull(argv[1], NULL, 0);
|
||||||
|
} else {
|
||||||
|
nthreads = 2;
|
||||||
|
}
|
||||||
|
if (argc > 2) {
|
||||||
|
niters = std::stoull(argv[2], NULL, 0);
|
||||||
|
} else {
|
||||||
|
niters = 1000;
|
||||||
|
}
|
||||||
|
std::vector<std::thread> threads(nthreads);
|
||||||
|
for (size_t i = 0; i < nthreads; ++i)
|
||||||
|
threads[i] = std::thread(threadMain);
|
||||||
|
for (size_t i = 0; i < nthreads; ++i)
|
||||||
|
threads[i].join();
|
||||||
|
assert(my_atomic_ulong.load() == nthreads * niters);
|
||||||
|
// Same as above through `operator T`.
|
||||||
|
assert(my_atomic_ulong == nthreads * niters);
|
||||||
|
std::cout << my_non_atomic_ulong << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Sanity checking low level stuff, initially inspired by baremetal.
|
// Sanity checking low level stuff, initially inspired by baremetal.
|
||||||
// https://github.com/cirosantilli/linux-kernel-module-cheat#baremetal-cpp
|
// https://github.com/cirosantilli/linux-kernel-module-cheat#cpp
|
||||||
|
|
||||||
int main() {}
|
int main() {}
|
||||||
|
|||||||
Reference in New Issue
Block a user