├── .bazelrc ├── .clang-format ├── .gitignore ├── .vscode ├── cpp_properties.json ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── MODULE.bazel ├── MODULE.bazel.lock ├── README.md ├── a.out ├── cpp_multithreading_timeline_wavy.png ├── lambda_jthread_main ├── main ├── src ├── lib │ ├── BUILD │ ├── logger.h │ ├── range_accumulator.h │ ├── utility.h │ └── vector_accumulator.h └── main │ ├── BUILD │ ├── async_lambda_main.cc │ ├── async_main.cc │ ├── atomic │ ├── BUILD │ ├── atomic_demo_main.cc │ ├── compare_exchange_main.cc │ ├── fedoro_main.cc │ ├── fetch_main.cc │ ├── lock_free_main.cc │ ├── plot.py │ ├── range_accumulator_benchmark.cc │ ├── range_accumulator_benchmark.csv │ ├── vector_accumulator_benchmark.cc │ └── vector_accumulator_benchmark.csv │ ├── conditional_variable │ ├── BUILD │ ├── producer_consumer_conditional_var_main.cc │ ├── producer_consumer_conditional_var_simple.cc │ └── producer_consumer_lock_main.cc │ ├── exceptions │ ├── BUILD │ ├── basic_exception.cc │ ├── central_queue.cc │ ├── exception_ptr.cc │ ├── exception_ptr_vector.cpp │ ├── future_promise_jthread.cc │ ├── future_promise_thread.cc │ ├── jthread_exception.cc │ ├── raii.py │ ├── safe_locks.cc │ ├── thread_handling_exception.cc │ └── thread_not_handling_exception.cc │ ├── functors_main.cc │ ├── functors_main_unique_ptr.cc │ ├── jthread │ ├── BUILD │ ├── bad_thread1.cc │ ├── bad_thread2.cc │ ├── bad_thread_stop_1.cc │ ├── bad_thread_stop_2.cc │ ├── bad_thread_stop_3.cc │ ├── bad_thread_stop_with_callback.cc │ ├── better_jthread_stop_with_callback.cc │ ├── better_jthread_stop_with_callback2.cc │ ├── cppThreadEvolution.py │ ├── good_jthread1.cc │ ├── good_jthread2.cc │ ├── good_jthread_stop_1.cc │ ├── good_jthread_stop_2.cc │ ├── good_jthread_stop_with_callback.cc │ ├── jthread.cc │ ├── lambda_jthread_main.cc │ └── pitfalls.cc │ ├── lambda_main.cc │ ├── main.cc │ ├── map_reduce │ ├── BUILD │ ├── count_words.cc │ ├── count_words_file.cc │ ├── khayam.txt │ ├── lib │ │ ├── BUILD │ │ ├── map_reduce.h │ │ └── thread_safe_map.h │ ├── masnavi.txt │ ├── shakespear.txt │ └── tests │ │ ├── BUILD │ │ └── map_reduce_test.cc │ ├── memory_order │ ├── BUILD │ ├── aquire_release_main.cc │ ├── memory_order_counter_main copy 2.cc │ ├── memory_order_counter_main.cc │ ├── memory_order_main.cc │ ├── relaxed_4_threads_main.cc │ ├── relaxed_main.cc │ ├── relaxed_main_two_threads.cc │ ├── release_acquire_3t_main.cc │ ├── release_acquire_main.cc │ ├── release_acquire_main_simple.cc │ ├── seq_cst_main.cc │ ├── sequential_consistency_atomic_main.cc │ └── sequential_consistency_main.cc │ ├── mutex │ ├── BUILD │ ├── lock_guard_main.cc │ ├── lock_guard_multiple_mutex_main.cc │ ├── lock_unlock_main.cc │ ├── mutex_seq_cst_main.cc │ ├── no_lock_main.cc │ ├── race_condition_main.cc │ ├── shared_mutex_main.cc │ ├── test_main.cc │ └── unique_lock_main.cc │ ├── number_of_cores.cc │ └── vector_of_threads_main.cc ├── tests ├── BUILD ├── range_accumulator_test.cc ├── solution_test.cc └── vector_accumulator_test.cc └── youtube.png /.bazelrc: -------------------------------------------------------------------------------- 1 | # Address sanitizer config 2 | # Use with bazel run --config=asan or lsan 3 | build:asan --strip=never 4 | build:asan --copt -fsanitize=address 5 | build:asan --copt -DADDRESS_SANITIZER 6 | build:asan --copt -O0 7 | build:asan --copt -g 8 | build:asan --copt -fno-omit-frame-pointer 9 | build:asan --linkopt -fsanitize=address 10 | build:asan --sandbox_debug 11 | build:asan --spawn_strategy=standalone 12 | build --host_cxxopt='-std=c++23' 13 | 14 | # Memory sanitizer config 15 | build:msan --strip=never 16 | build:msan --copt -fsanitize=memory 17 | build:msan --copt -O0 18 | build:msan --copt -g 19 | build:msan --linkopt -fsanitize=memory 20 | build:msan --sandbox_debug 21 | build:msan --spawn_strategy=standalone 22 | 23 | # Thread sanitizer config 24 | build:tsan --copt -fsanitize=thread 25 | 26 | build --cxxopt='-std=c++23' 27 | build --cxxopt='-stdlib=libc++' 28 | build --cxxopt='-fexperimental-library' 29 | build --host_cxxopt='-std=c++23' 30 | build --host_cxxopt='-stdlib=libc++' 31 | -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: Google 2 | IndentWidth: 2 3 | AlwaysBreakTemplateDeclarations: Yes -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /bazel-Bazel_with_GTest 2 | /bazel-bin 3 | /bazel-genfiles 4 | /bazel-out 5 | /bazel-testlogs 6 | /bazel-template 7 | /bazel-* 8 | -------------------------------------------------------------------------------- /.vscode/cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Mac", 5 | "includePath": [ 6 | "${workspaceFolder}/**", 7 | "/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/v1" 8 | ], 9 | "defines": [], 10 | "compilerPath": "/usr/bin/clang++", 11 | "cStandard": "c17", 12 | "cppStandard": "c++20", 13 | "intelliSenseMode": "macos-clang-x64", 14 | "compilerArgs": [ 15 | "-stdlib=libc++", 16 | "-std=c++20", 17 | "-fexperimental-library" 18 | ] 19 | } 20 | ], 21 | "version": 4 22 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. 3 | // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp 4 | 5 | // List of extensions which should be recommended for users of this workspace. 6 | "recommendations": [ 7 | 8 | ], 9 | // List of extensions recommended by VS Code that should not be recommended for users of this workspace. 10 | "unwantedRecommendations": [ 11 | 12 | ] 13 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "(lldb) Launch Run", 9 | "preLaunchTask": "Bazel Build (Run)", 10 | "type": "cppdbg", 11 | "request": "launch", 12 | "program": "${workspaceFolder}/bazel-bin/${relativeFileDirname}/${fileBasenameNoExtension}", 13 | "args": [], 14 | "stopAtEntry": false, 15 | "cwd": "${workspaceFolder}/bazel-bin/${relativeFileDirname}/${fileBasenameNoExtension}.runfiles/__main__", 16 | "environment": [], 17 | "externalConsole": false, 18 | "MIMode": "lldb" 19 | }, 20 | { 21 | "name": "(lldb) Launch Run Opt", 22 | "preLaunchTask": "Bazel Build (Run Opt)", 23 | "type": "cppdbg", 24 | "request": "launch", 25 | "program": "${workspaceFolder}/bazel-bin/${relativeFileDirname}/${fileBasenameNoExtension}", 26 | "args": [], 27 | "stopAtEntry": false, 28 | "cwd": "${workspaceFolder}/bazel-bin/${relativeFileDirname}/${fileBasenameNoExtension}.runfiles/__main__", 29 | "environment": [], 30 | "externalConsole": false, 31 | "MIMode": "lldb" 32 | }, 33 | { 34 | "name": "(lldb) Launch Debug", 35 | "preLaunchTask": "Bazel Build (Debug)", 36 | "type": "cppdbg", 37 | "request": "launch", 38 | "program": "${workspaceFolder}/bazel-bin/${relativeFileDirname}/${fileBasenameNoExtension}", 39 | "args": [], 40 | "stopAtEntry": false, 41 | "cwd": "${workspaceFolder}/bazel-bin/${relativeFileDirname}/${fileBasenameNoExtension}.runfiles/__main__", 42 | "environment": [], 43 | "externalConsole": false, 44 | "MIMode": "lldb" 45 | }, 46 | { 47 | "preLaunchTask": "Bazel Build (Debug)", 48 | "name": "CodeLLDB", 49 | "type": "lldb", 50 | "request": "launch", 51 | "program": "${workspaceFolder}/bazel-bin/src/main/${fileBasenameNoExtension}", 52 | "args": [], 53 | // *** You need to change this part for your own system to work *** 54 | // Set sourceMap from output of (readlink -n bazel-cpp-template) to ${workspaceFolder} 55 | "sourceMap": { 56 | "/private/var/tmp/_bazel_ari/8b6cf68db0ea2d6ea3f9c3ed5620d651/execroot/__main__": "${workspaceFolder}/" 57 | }, 58 | }, 59 | ] 60 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "string": "cpp", 4 | "filesystem": "cpp", 5 | "iosfwd": "cpp", 6 | "__bit_reference": "cpp", 7 | "__config": "cpp", 8 | "__debug": "cpp", 9 | "__errc": "cpp", 10 | "__functional_base": "cpp", 11 | "__hash_table": "cpp", 12 | "__locale": "cpp", 13 | "__mutex_base": "cpp", 14 | "__node_handle": "cpp", 15 | "__nullptr": "cpp", 16 | "__split_buffer": "cpp", 17 | "__string": "cpp", 18 | "__threading_support": "cpp", 19 | "__tree": "cpp", 20 | "__tuple": "cpp", 21 | "algorithm": "cpp", 22 | "array": "cpp", 23 | "atomic": "cpp", 24 | "bit": "cpp", 25 | "bitset": "cpp", 26 | "cctype": "cpp", 27 | "chrono": "cpp", 28 | "cinttypes": "cpp", 29 | "cmath": "cpp", 30 | "complex": "cpp", 31 | "cstdarg": "cpp", 32 | "cstddef": "cpp", 33 | "cstdint": "cpp", 34 | "cstdio": "cpp", 35 | "cstdlib": "cpp", 36 | "cstring": "cpp", 37 | "ctime": "cpp", 38 | "cwchar": "cpp", 39 | "cwctype": "cpp", 40 | "deque": "cpp", 41 | "exception": "cpp", 42 | "fstream": "cpp", 43 | "functional": "cpp", 44 | "initializer_list": "cpp", 45 | "iomanip": "cpp", 46 | "ios": "cpp", 47 | "iostream": "cpp", 48 | "istream": "cpp", 49 | "iterator": "cpp", 50 | "limits": "cpp", 51 | "locale": "cpp", 52 | "map": "cpp", 53 | "memory": "cpp", 54 | "mutex": "cpp", 55 | "new": "cpp", 56 | "optional": "cpp", 57 | "ostream": "cpp", 58 | "ratio": "cpp", 59 | "set": "cpp", 60 | "sstream": "cpp", 61 | "stack": "cpp", 62 | "stdexcept": "cpp", 63 | "streambuf": "cpp", 64 | "string_view": "cpp", 65 | "system_error": "cpp", 66 | "thread": "cpp", 67 | "tuple": "cpp", 68 | "type_traits": "cpp", 69 | "typeinfo": "cpp", 70 | "unordered_map": "cpp", 71 | "utility": "cpp", 72 | "vector": "cpp", 73 | "numeric": "cpp", 74 | "future": "cpp", 75 | "shared_mutex": "cpp", 76 | "condition_variable": "cpp", 77 | "random": "cpp", 78 | "codecvt": "cpp", 79 | "list": "cpp", 80 | "regex": "cpp", 81 | "forward_list": "cpp", 82 | "unordered_set": "cpp", 83 | "memory_resource": "cpp", 84 | "clocale": "cpp", 85 | "*.tcc": "cpp", 86 | "compare": "cpp", 87 | "concepts": "cpp", 88 | "numbers": "cpp", 89 | "semaphore": "cpp", 90 | "stop_token": "cpp", 91 | "cfenv": "cpp", 92 | "__verbose_abort": "cpp", 93 | "charconv": "cpp", 94 | "execution": "cpp", 95 | "print": "cpp", 96 | "queue": "cpp", 97 | "variant": "cpp", 98 | "any": "cpp", 99 | "span": "cpp", 100 | "jthread": "cpp" 101 | }, 102 | "lldb.displayFormat": "auto", 103 | "lldb.showDisassembly": "never", 104 | "lldb.dereferencePointers": true 105 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // Modified to enable debugging using bazel 2 | { 3 | "version": "2.0.0", 4 | "tasks": [ 5 | { 6 | "label": "Bazel Build (Debug)", 7 | "type": "shell", 8 | "command": "bazel build --cxxopt='-std=c++17' ${relativeFileDirname}:${fileBasenameNoExtension} -c dbg", 9 | "windows": { 10 | "command": "bazel build --cxxopt='-std=c++17' ${relativeFileDirname}:${fileBasenameNoExtension} --experimental_enable_runfiles -c dbg" 11 | }, 12 | "osx": { 13 | "command": "bazel build --cxxopt='-std=c++17' ${relativeFileDirname}:${fileBasenameNoExtension} -c dbg --spawn_strategy=standalone", 14 | }, 15 | "group": { 16 | "kind": "build", 17 | "isDefault": true 18 | }, 19 | }, 20 | { 21 | "label": "Bazel Build (Run)", 22 | "type": "shell", 23 | "command": "bazel build --cxxopt='-std=c++17' --run_under=lldb ${relativeFileDirname}:${fileBasenameNoExtension}", 24 | "windows": { 25 | "command": "bazel build --cxxopt='-std=c++17' --run_under=lldb ${relativeFileDirname}:${fileBasenameNoExtension}" 26 | }, 27 | "osx": { 28 | "command": "bazel build --cxxopt='-std=c++17' --run_under=lldb ${relativeFileDirname}:${fileBasenameNoExtension}", 29 | }, 30 | "group": { 31 | "kind": "build", 32 | "isDefault": true 33 | }, 34 | }, 35 | { 36 | "label": "Bazel Build (Run)", 37 | "type": "shell", 38 | "command": "bazel build --cxxopt='-std=c++17' ${relativeFileDirname}:${fileBasenameNoExtension}", 39 | "windows": { 40 | "command": "bazel build --cxxopt='-std=c++17' ${relativeFileDirname}:${fileBasenameNoExtension}" 41 | }, 42 | "osx": { 43 | "command": "bazel build --cxxopt='-std=c++17' ${relativeFileDirname}:${fileBasenameNoExtension}", 44 | }, 45 | "group": { 46 | "kind": "build", 47 | "isDefault": true 48 | }, 49 | }, 50 | { 51 | "label": "Bazel Build (Run Opt)", 52 | "type": "shell", 53 | "command": "bazel build --cxxopt='-std=c++17' ${relativeFileDirname}:${fileBasenameNoExtension} -c opt", 54 | "windows": { 55 | "command": "bazel build --cxxopt='-std=c++17' ${relativeFileDirname}:${fileBasenameNoExtension} -c opt" 56 | }, 57 | "osx": { 58 | "command": "bazel build --cxxopt='-std=c++17' ${relativeFileDirname}:${fileBasenameNoExtension} -c opt", 59 | }, 60 | "group": { 61 | "kind": "build", 62 | "isDefault": true 63 | }, 64 | } 65 | ] 66 | } -------------------------------------------------------------------------------- /MODULE.bazel: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Bazel now uses Bzlmod by default to manage external dependencies. 3 | # Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel. 4 | # 5 | # For more details, please check https://github.com/bazelbuild/bazel/issues/18958 6 | ############################################################################### 7 | module(name = "multithreading_cpp", version = "0.1.0") 8 | 9 | bazel_dep(name = "rules_cc", version = "0.0.9") 10 | 11 | bazel_dep(name = "googletest", version = "1.14.0") 12 | bazel_dep(name = "google_benchmark", version = "1.9.2") 13 | -------------------------------------------------------------------------------- /MODULE.bazel.lock: -------------------------------------------------------------------------------- 1 | { 2 | "lockFileVersion": 18, 3 | "registryFileHashes": { 4 | "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", 5 | "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", 6 | "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", 7 | "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", 8 | "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", 9 | "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", 10 | "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", 11 | "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", 12 | "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", 13 | "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", 14 | "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", 15 | "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", 16 | "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", 17 | "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", 18 | "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", 19 | "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", 20 | "https://bcr.bazel.build/modules/bazel_features/1.21.0/source.json": "3e8379efaaef53ce35b7b8ba419df829315a880cb0a030e5bb45c96d6d5ecb5f", 21 | "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", 22 | "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", 23 | "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", 24 | "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", 25 | "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", 26 | "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", 27 | "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", 28 | "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", 29 | "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", 30 | "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", 31 | "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", 32 | "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", 33 | "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", 34 | "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953", 35 | "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", 36 | "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", 37 | "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", 38 | "https://bcr.bazel.build/modules/google_benchmark/1.9.2/MODULE.bazel": "1d30f717f00d5f18e7d8e55d18573bab80651d75b40e3391af2992cd2568577a", 39 | "https://bcr.bazel.build/modules/google_benchmark/1.9.2/source.json": "fd301b911848c3ad83700d1bf5b90ad23afc24f25a9cc34d8297ab6203cfe39d", 40 | "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", 41 | "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", 42 | "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4", 43 | "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", 44 | "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", 45 | "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", 46 | "https://bcr.bazel.build/modules/libpfm/4.11.0.bcr.1/MODULE.bazel": "e5362dadc90aab6724c83a2cc1e67cbed9c89a05d97fb1f90053c8deb1e445c8", 47 | "https://bcr.bazel.build/modules/libpfm/4.11.0.bcr.1/source.json": "0646414d9037f8aad148781dd760bec90b0b25ac12fda5e03f8aadbd6b9c61e6", 48 | "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", 49 | "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", 50 | "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", 51 | "https://bcr.bazel.build/modules/platforms/0.0.11/source.json": "f7e188b79ebedebfe75e9e1d098b8845226c7992b307e28e1496f23112e8fc29", 52 | "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", 53 | "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", 54 | "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", 55 | "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", 56 | "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", 57 | "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", 58 | "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", 59 | "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", 60 | "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", 61 | "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", 62 | "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981", 63 | "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", 64 | "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", 65 | "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", 66 | "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", 67 | "https://bcr.bazel.build/modules/re2/2023-09-01/source.json": "e044ce89c2883cd957a2969a43e79f7752f9656f6b20050b62f90ede21ec6eb4", 68 | "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", 69 | "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", 70 | "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", 71 | "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", 72 | "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", 73 | "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac", 74 | "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", 75 | "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", 76 | "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", 77 | "https://bcr.bazel.build/modules/rules_cc/0.0.17/source.json": "4db99b3f55c90ab28d14552aa0632533e3e8e5e9aea0f5c24ac0014282c2a7c5", 78 | "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", 79 | "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", 80 | "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", 81 | "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", 82 | "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", 83 | "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", 84 | "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", 85 | "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", 86 | "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", 87 | "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", 88 | "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", 89 | "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", 90 | "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", 91 | "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", 92 | "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", 93 | "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", 94 | "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", 95 | "https://bcr.bazel.build/modules/rules_java/8.11.0/MODULE.bazel": "c3d280bc5ff1038dcb3bacb95d3f6b83da8dd27bba57820ec89ea4085da767ad", 96 | "https://bcr.bazel.build/modules/rules_java/8.11.0/source.json": "302b52a39259a85aa06ca3addb9787864ca3e03b432a5f964ea68244397e7544", 97 | "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", 98 | "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", 99 | "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", 100 | "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", 101 | "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", 102 | "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", 103 | "https://bcr.bazel.build/modules/rules_jvm_external/6.3/source.json": "6f5f5a5a4419ae4e37c35a5bb0a6ae657ed40b7abc5a5189111b47fcebe43197", 104 | "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", 105 | "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", 106 | "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", 107 | "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", 108 | "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", 109 | "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", 110 | "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", 111 | "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", 112 | "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", 113 | "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", 114 | "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", 115 | "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", 116 | "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", 117 | "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", 118 | "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", 119 | "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", 120 | "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", 121 | "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", 122 | "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", 123 | "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", 124 | "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", 125 | "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", 126 | "https://bcr.bazel.build/modules/rules_python/0.40.0/source.json": "939d4bd2e3110f27bfb360292986bb79fd8dcefb874358ccd6cdaa7bda029320", 127 | "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", 128 | "https://bcr.bazel.build/modules/rules_shell/0.2.0/source.json": "7f27af3c28037d9701487c4744b5448d26537cc66cdef0d8df7ae85411f8de95", 129 | "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", 130 | "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", 131 | "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", 132 | "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", 133 | "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", 134 | "https://bcr.bazel.build/modules/stardoc/0.7.1/source.json": "b6500ffcd7b48cd72c29bb67bcac781e12701cc0d6d55d266a652583cfcdab01", 135 | "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", 136 | "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", 137 | "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79", 138 | "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d", 139 | "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" 140 | }, 141 | "selectedYankedVersions": {}, 142 | "moduleExtensions": { 143 | "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { 144 | "general": { 145 | "bzlTransitiveDigest": "sFhcgPbDQehmbD1EOXzX4H1q/CD5df8zwG4kp4jbvr8=", 146 | "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", 147 | "recordedFileInputs": {}, 148 | "recordedDirentsInputs": {}, 149 | "envVariables": {}, 150 | "generatedRepoSpecs": { 151 | "com_github_jetbrains_kotlin_git": { 152 | "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", 153 | "attributes": { 154 | "urls": [ 155 | "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" 156 | ], 157 | "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" 158 | } 159 | }, 160 | "com_github_jetbrains_kotlin": { 161 | "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", 162 | "attributes": { 163 | "git_repository_name": "com_github_jetbrains_kotlin_git", 164 | "compiler_version": "1.9.23" 165 | } 166 | }, 167 | "com_github_google_ksp": { 168 | "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", 169 | "attributes": { 170 | "urls": [ 171 | "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" 172 | ], 173 | "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", 174 | "strip_version": "1.9.23-1.0.20" 175 | } 176 | }, 177 | "com_github_pinterest_ktlint": { 178 | "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", 179 | "attributes": { 180 | "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", 181 | "urls": [ 182 | "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" 183 | ], 184 | "executable": true 185 | } 186 | }, 187 | "rules_android": { 188 | "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", 189 | "attributes": { 190 | "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", 191 | "strip_prefix": "rules_android-0.1.1", 192 | "urls": [ 193 | "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" 194 | ] 195 | } 196 | } 197 | }, 198 | "recordedRepoMappingEntries": [ 199 | [ 200 | "rules_kotlin+", 201 | "bazel_tools", 202 | "bazel_tools" 203 | ] 204 | ] 205 | } 206 | } 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Multi Threading Tutorial in C++ 2 | 3 | > Quick demonstration of multi threading in modern C++ 4 | 5 | Features: 6 | 7 | - [x] Creating task and threads 8 | - [x] Using function pointers, functors, and lambda functions 9 | - [x] Futures, promises, and async tasks 10 | - [x] Mutex and Locks 11 | - [x] Conditional Variables 12 | - [x] JThreads 13 | - [x] Supports Google [Bazel](https://bazel.build/) 14 | 15 | 16 | 17 | Here is the video explaining how to use multi-threading in C++: 18 | 19 |
20 |
21 |
22 | ![]() |