VietTuts

Tự Học Lập Trình Online

  • Home
  • Java
  • Servlet
  • JSP
  • Struts2
  • Hibernate
  • Spring
  • MyBatis
  • Java WS
  • C
  • C++
  • C#
  • Python
  • PHP
  • Excel
  • VBA
  • Web
    • JavaScript
    • JQUERY
    • JSON
    • AJAX
    • CSS
    • HTML
    • HTML5
    • Node.js
    • Angular 7
  • SQL
    • MySQL
    • SQL Server
  • Misc
    • Eclipse
    • Phần mềm tiện ích
    • Cấu trúc DL&GT
    • Selenium Test

C++ Cơ Bản

Ngôn ngữ lập trình C++ là gì? Lịch sử của C++ Các tính năng của C++ Cài đặt môi trường lập trình C++ Chương trình C++ đầu tiên Biến trong C++ Các kiểu dữ liệu trong C++ Ép kiểu trong C++ Từ khóa trong C++ Các toán tử trong C++ Comment trong C++ Các hằng số trong C++ count, cin và endl trong C++ Ký tự đặc biệt trong C++ Namespace trong C++ Template trong C++ Modifier trong C/C++

Câu Lệnh Điều Khiển C++

Mệnh đề if-else Mệnh đề switch Vòng lặp for Vòng lặp while Vòng lặp do-while Lệnh Break Lệnh Continue Lệnh Goto

C++ Function

Hàm trong C++ Hàm do người dùng định nghĩa Các kiểu hàm trong C++ Đệ quy trong C++ Call by value Call by reference

C++ Array

Mảng (array) trong C++ Mảng 2 chiều trong C++ Truyền mảng vào hàm

C++ Poiter

Con trỏ trong C++ Con trỏ Null trong C++ Con trỏ số học trong C++ Con trỏ và mảng trong C++ Mảng con trỏ trong C++ Con trỏ tới con trỏ trong C++ Truyền con trỏ tới hàm trong C++ Trả về con trỏ từ hàm trong C++

C++ Lớp Object

Khái niệm lập trình hướng đối tượng trong C++ Lớp và đối tượng trong C++ Constructor trong C++ Destructor trong C++ this trong C++ static trong C++ struct trong C++ Enumeration trong C++ Hàm Friend trong C++ Hàm Math trong C++ Tính kế thừa trong C++ Tính đa hình trong C++ Tính trừu tượng trong C++ Tính đóng gói trong C++ Interface trong C++

Nạp Chồng Toán Tử

Nạp chồng toán tử và Nạp chồng hàm trong C++ Nạp chồng toán tử một ngôi trong C++ Nạp chồng toán tử nhị phân trong C++ Nạp chồng toán tử quan hệ trong C++ Nạp chồng toán tử Input/Output trong C++ Nạp chồng toán tử ++ và -- trong C++ Nạp chồng toán tử gán trong C++ Nạp chồng toán tử gọi hàm () trong C++ Nạp chồng toán tử subscript [] trong C++ Nạp chồng toán tử truy cập thành viên lớp (->) trong C++

Lập Trình C++

Xử lý ngoại lệ trong C++ Đa luồng trong C++
Bài Tập C++ Có Lời Giải
1 / 3
❮ ❯

Đa luồng trong C++


Xử lý ngoại lệ trong C++
Bài tập C++ có lời giải

Nội dung chính

  • Đa luồng (Multithread) trong C++
  • Tạo Thread trong C++
  • Kết thúc Thread trong C++
  • Ví dụ đa luồng trong C++
  • Truyền tham số tới Thread trong C++
  • Kết hợp và Tháo gỡ các Thread trong C++

Đa luồng (Multithread) trong C++

Đa luồng (Multithreading) là một form chuyên dụng của đa nhiệm (multitasking) và một đa nhiệm là tính năng cho phép máy tính của bạn chạy hai hoặc nhiều chương trình đồng thời. Nói chung, có hai kiểu đa nhiệm là: process-based và thread-based tương ứng: dựa trên tiến trình và dựa trên luồng.

Đa nhiệm dựa trên tiến trình xử lý việc thực thi đồng thời của các chương trình. Đa nhiệm dựa trên luồng xử lý việc thực thi đồng thời các phần của cùng một chương trình.

Một chương trình đa luồng chứa hai hoặc nhiều phần mà có thể chạy đồng thời. Mỗi phần của chương trình đó được gọi là một thread, và mỗi thread định nghĩa một path riêng biệt của sự thực thi.

C++ không chứa bất kỳ hỗ trợ có sẵn nào cho các ứng dụng đa luồng. Thay vào đó, nó dựa hoàn toàn vào Hệ điều hành để cung cấp tính năng này.

Chương này giả sử bạn đang làm việc trên Hệ điều hành Linux và chúng tôi đang chuẩn bị viết chương trình đa luồng trong C++ bởi sử dụng POSIX. POSIX Threads hoặc Pthreads cung cấp API mà có sẵn trên nhiều hệ thống như FreeBSD, NetBSD, GNU/Linux, Mac OS X và Solaris.


Tạo Thread trong C++

Đây là chương trình chúng ta sử dụng để tạo một POSIX thread:


#include <pthread.h>
pthread_create (thread, attr, start_routine, arg) 

Ở đây, pthread_create tạo một thread mới và làm nó có thể thực thi. Chương trình này có thể được gọi bất cứ thời điểm nào ở bất cứ đâu trong code của bạn. Dưới đây là miêu tả các tham số:

Tham số Mô tả
thread Một định danh duy nhất cho thread mới được trả về bởi chương trình con
attr Một thuộc tính mà có thể được sử dụng để thiết lập các thuộc tính của thread. Bạn có thể xác định một đối tượng thuộc tính thread, hoặc NULL cho các giá trị mặc định
start_routine Chương trình C++ mà thread này sẽ thực thi một khi nó được tạo
arg Một tham số đơn mà có thể được truyền tới start_routine. Nó phải được truyền bởi tham chiếu dạng một con trỏ của kiểu void. NULL có thể được sử dụng nếu không có tham số nào được truyền

Số thread tối đa có thể được tạo bởi một tiến trình là phụ thuộc vào trình triển khai (Implementation). Một khi được tạo, các thread là ngang hàng, và có thể tạo các thread khác. Không có sự phụ thuộc giữa các thread trong C++.


Kết thúc Thread trong C++

Chương trình sau được sử dụng để kết thúc một POSIX thread trong C++:


#include <pthread.h>
pthread_exit (status) 

Ở đây pthread_exit được sử dụng để kết thúc một thread. Chương trình pthread_exit() được gọi sau khi một thread đã hoàn thành công việc của nó và không cần thiết phải tồn tại nữa.

Nếu main() kết thúc trước các thread nó đã tạo, và kết thúc chương trình pthread_create(), thì các thread khác sẽ tiếp tục thực thi. Nếu không thì, chúng sẽ tự động được kết thúc khi main() hoàn thành.


Ví dụ đa luồng trong C++

Ví dụ đơn giản sau tạo 5 thread với chương trình pthread_create(). Mỗi thread in một thông báo "Hello World!", và sau đó kết thúc với một lời gọi tới pthread_exit() trong C++:


#include <iostream>
#include <cstdlib>
#include <pthread.h>
using namespace std;
#define THREAD_NUMBER 4

void *InLoiChao(void *threadid) 
{
    cout << "Hello World! Thread ID la " << threadid << endl;
    pthread_exit(NULL);
}

int main()
{
    pthread_t threads[THREAD_NUMBER];
    int rc;
    int i;
    for (i = 0; i < THREAD_NUMBER; i++) {
        cout << "\nmain() : dang tao thread! " << i << endl;
        rc = pthread_create(&threads[i], NULL,
            InLoiChao, (int*)i);
        if (rc) {
            cout << "\nError: Khong the tao thread!" << rc << endl;
            exit(-1);
        }
    }
    pthread_exit(NULL);
}

Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Đa luồng (Multithread) trong C++

Truyền tham số tới Thread trong C++

Ví dụ này minh họa cách truyền nhiều tham số thông qua một cấu trúc. Bạn có thể truyền bất kỳ kiểu dữ liệu nào trong một Thread callback, bởi vì nó trỏ tới void như được giải thích trong ví dụ sau:


#include <iostream>
#include <cstdlib>
#include <pthread.h>
using namespace std;
#define THREAD_NUMBER  5

struct du_lieu{
int  id;
char* thongdiep;
};

void* InLoiChao(void* thamso)
{
    struct du_lieu* data;
    data = (struct du_lieu*)thamso;
    cout << "\nThread ID la: " << data->id;
    cout << "\nThong diep: " << data->thongdiep << endl;
    pthread_exit(NULL);
}

int main()
{
    pthread_t threads[THREAD_NUMBER];
    struct du_lieu td[THREAD_NUMBER];
    int rc;
    int i;   for (i = 0; i < THREAD_NUMBER; i++) {
        cout << "\nmain() : dang tao thread! " << i << endl;
        td[i].id = i;
        td[i].thongdiep = "\nDay la thong diep";
        rc = pthread_create(&threads[i], NULL,
            InLoiChao, (void*)&td[i]);
        if (rc) {
            cout << "\nError: Khong the tao thread! " << rc << endl;
            exit(-1);
        }
    }
    pthread_exit(NULL);
}

Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Đa luồng (Multithread) trong C++

Kết hợp và Tháo gỡ các Thread trong C++

Hai cú pháp sau được sử dụng để kết hợp (joining) hoặc tháo gỡ (detaching) các Thread trong C++:


pthread_join (threadid, status) 
pthread_detach (threadid) 

Chương trình con pthread_join() đóng khối thread đang gọi tới khi threadid kết thúc. Khi một thread được tạo, một trong các thuộc tính định nghĩa nó là joinable hoặc detached. Chỉ các thread được tạo với dạng joinable có thể được kết hợp. Nếu một thread được tạo với dạng detached, nó không bao giờ được kết hợp.

Ví dụ sau minh họa cách đợi cho các thread kết thúc bởi sử dụng chương trình kết hợp Pthread trong C++:


#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>
using namespace std;
#define THREAD_NUMBER 5
void *wait(void *tid)
{
int i;
sleep(1);
cout << "\nDang tam dung mot Thread " << endl;
cout << "\nThread voi ID la : " << tid << "  ... dang thoat! " << endl;
pthread_exit(NULL);
}

int main()
{
    int rc;
    int i;
    pthread_t threads[THREAD_NUMBER];
    pthread_attr_t attr;
    void* status;
    // khoi tao va thiet lap mot thread co the ket hop
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    for (i = 0; i < THREAD_NUMBER; i++) {
        cout << "\nmain() : dang tao thread! " << i << endl;
        rc = pthread_create(&threads[i], NULL, wait, (void*)i);
        if (rc) {
            cout << "\nError: Khong the tao thread! " << rc << endl;
            exit(-1);
        }
    }
    // giai phong thuoc tinh va doi thread khac
    pthread_attr_destroy(&attr);
    for (i = 0; i < THREAD_NUMBER; i++) {
        rc = pthread_join(threads[i], &status);
        if (rc) {
            cout << "\nError: khong the ket hop! " << rc << endl;
            exit(-1);
        }
        cout << "\nMain: ket huc thread id :" << i;
        cout << "  va thoat voi trang thai:" << status << endl;
    }   cout << "\nMain: thoat chuong trinh!" << endl;
    pthread_exit(NULL);
}

Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Đa luồng (Multithread) trong C++
Xử lý ngoại lệ trong C++
Bài tập C++ có lời giải

Recent Updates

Đa luồng trong C++Xử lý ngoại lệ trong C++Nạp chồng toán tử truy cập thành viên lớp (->) trong C++Nạp chồng toán tử subscript [] trong C++Nạp chồng toán tử gọi hàm () trong C++Nạp chồng toán tử gán trong C++Nạp chồng toán tử ++ và -- trong C++Nạp chồng toán tử Input/Output trong C++Nạp chồng toán tử quan hệ trong C++Nạp chồng toán tử nhị phân trong C++Nạp chồng toán tử một ngôi trong C++Nạp chồng toán tử và Nạp chồng hàm trong C++Sắp Tết 2026 Rồi! - Còn bao nhiêu ngày nữa là đến tết 2026?

VietTuts on facebook

Học Lập Trình Online Miễn Phí - VietTuts.Vn
Danh Sách Bài Học

Học Java | Hibernate | Spring
Học Excel | Excel VBA
Học Servlet | JSP | Struts2
Học C | C++ | C#
Học Python
Học SQL

Bài Tập Có Lời Giải

Bài tập Java
Bài tập C
Bài tập C++
Bài tập C#
Bài tập Python
Ví dụ Excel VBA

Câu Hỏi Phỏng Vấn

201 câu hỏi phỏng vấn java
25 câu hỏi phỏng vấn servlet
75 câu hỏi phỏng vấn jsp
52 câu hỏi phỏng vấn Hibernate
70 câu hỏi phỏng vấn Spring
57 câu hỏi phỏng vấn SQL

Scroll back to top

Copyright © 2016 VietTuts.Vn all rights reserved. | Liên hệ | Chính sách - riêng tư | sitemap.html | sitemap_index.xml