Cambo Freelance
ទំព័រដើមសេវាកម្មអត្ថបទការបង្រៀនក្រុមវគ្គបណ្តុះបណ្តាលទំនាក់ទំនង
Cambo Freelance

Professional freelance team from Cambodia delivering technology-driven solutions with cultural insight and modern expertise.

ផ្ញើសាររបស់អ្នក

ត្រៀមចាប់ផ្តើមគម្រោងរបស់អ្នក? ទំនាក់ទំនងក្រុមរបស់យើង។

ទំនាក់ទំនង

សេវាកម្ម

  • Web & Mobile Development Services
  • Graphic Design & Branding Services

តំណភ្ជាប់មានប្រយោជន៍

  • ទំព័រដើម
  • សេវាកម្ម
  • ការសិក្សា
  • អំពីយើង
  • ទំនាក់ទំនង
  • តម្លៃ

© 2026 Cambo Freelance. រក្សាសិទ្ធិទាំងអស់។

TelegramFacebookLinkedInEmail
HomeTutorialsC++C++ Multithreading
⚡C++ Tutorials

50 lessons

Beginner(21)1C++ Introduction2C++ Getting Started3C++ Syntax4C++ Output5C++ Comments6C++ Variables7C++ Data Types8C++ Constants9C++ User Input10C++ Operators11C++ Strings12C++ Math13C++ Booleans14C++ Conditions15C++ Switch16C++ Loops17C++ Break and Continue18C++ Arrays19C++ Functions20C++ References21C++ Pointers
Intermediate(19)22C++ Classes23C++ Objects24C++ Constructors25C++ Access Specifiers
Advanced(10)41C++ Smart Pointers42C++ Templates43C++ Lambda Functions44
⚡

C++ Tutorials

Lesson 45 of 50

All lessons
Beginner (21)1C++ Introduction2C++ Getting Started
26
C++ Encapsulation
27C++ Inheritance
28C++ Polymorphism
29C++ Abstraction
30C++ Files
31C++ Exception Handling
32C++ Namespaces
33C++ Structures
34C++ Enumerations
35C++ STL Introduction
36C++ Vectors
37C++ Maps
38C++ Sets
39C++ Queues
40C++ Stacks
C++ Move Semantics
45C++ Multithreading
46C++ Design Patterns
47C++ Memory Management
48C++17 Features
49C++20 Features
50C++ Performance Optimization
3
C++ Syntax
4C++ Output
5C++ Comments
6C++ Variables
7C++ Data Types
8C++ Constants
9C++ User Input
10C++ Operators
11C++ Strings
12C++ Math
13C++ Booleans
14C++ Conditions
15C++ Switch
16C++ Loops
17C++ Break and Continue
18C++ Arrays
19C++ Functions
20C++ References
21C++ Pointers
Intermediate (19)22C++ Classes23C++ Objects24C++ Constructors25C++ Access Specifiers26C++ Encapsulation27C++ Inheritance28C++ Polymorphism29C++ Abstraction30C++ Files31C++ Exception Handling32C++ Namespaces33C++ Structures34C++ Enumerations35C++ STL Introduction36C++ Vectors37C++ Maps38C++ Sets39C++ Queues40C++ Stacks
Advanced (10)41C++ Smart Pointers42C++ Templates43C++ Lambda Functions44C++ Move Semantics45C++ Multithreading46C++ Design Patterns47C++ Memory Management48C++17 Features49C++20 Features50C++ Performance Optimization
⚡C++AdvancedLesson 45 of 50CamboFreelanceJune 19, 2026

C++ Multithreading

Introduction to C++ multithreading: std::thread, mutex, lock_guard, async, and future. Write safe concurrent programs.


Tutorials › C++ › Multithreading
Advanced12 min readLesson 45 of 50

std::thread (C++11)

C++11 introduced native threading via <thread>. Compile with -std=c++11 -pthread.

#include <iostream>
#include <thread>
#include <chrono>
using namespace std;

void task(int id) {
    cout << "Thread " << id << " starting\n";
    this_thread::sleep_for(chrono::milliseconds(100 * id));
    cout << "Thread " << id << " done\n";
}

int main() {
    thread t1(task, 1);
    thread t2(task, 2);
    thread t3(task, 3);

    t1.join();   // wait for t1 to finish
    t2.join();
    t3.join();

    cout << "All threads completed." << endl;
    return 0;
}

Mutex — Preventing Race Conditions

#include <iostream>
#include <thread>
#include <mutex>
using namespace std;

mutex mtx;
int counter = 0;

void increment(int n) {
    for (int i = 0; i < n; i++) {
        lock_guard<mutex> lock(mtx);   // auto-unlocks when out of scope
        counter++;
    }
}

int main() {
    thread t1(increment, 10000);
    thread t2(increment, 10000);
    t1.join(); t2.join();
    cout << "Counter: " << counter << endl;   // 20000 (thread-safe)
    return 0;
}

std::async and std::future

#include <future>

auto result = async(launch::async, []() {
    // heavy computation
    int sum = 0;
    for (int i = 1; i <= 1000000; i++) sum += i;
    return sum;
});

cout << "Result: " << result.get() << endl;   // blocks until done
Warning: Always join() or detach() threads before they go out of scope. Destroying a joinable thread calls std::terminate().

Exercise

Create two threads: one prints even numbers 0–10, the other prints odd numbers 1–9. Use a mutex to prevent interleaved output.

Show Solution
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;

mutex print_mtx;

void printEvens() {
    for (int i = 0; i <= 10; i += 2) {
        lock_guard<mutex> lock(print_mtx);
        cout << "Even: " << i << endl;
    }
}
void printOdds() {
    for (int i = 1; i <= 9; i += 2) {
        lock_guard<mutex> lock(print_mtx);
        cout << "Odd: " << i << endl;
    }
}

int main() {
    thread t1(printEvens), t2(printOdds);
    t1.join(); t2.join();
    return 0;
}

Quiz

  1. What is a race condition?

    • A) A thread running too fast
    • B> Multiple threads accessing shared data without synchronization, causing unpredictable results
    • C) Thread deadlock
    • D> Thread starvation
    Answer

    B) A race condition occurs when multiple threads access/modify shared data concurrently without proper synchronization.

Summary

  • std::thread creates concurrent threads; join() waits for them.
  • Use mutex with lock_guard to prevent race conditions.
  • std::async runs tasks asynchronously and returns a future.
← Previous: Move Semantics Next: Design Patterns →
c++multithreadingconcurrencyadvanced
PreviousLesson 44: C++ Move SemanticsNextLesson 46: C++ Design Patterns
Back to All Tutorials