• About
  • Advertise
  • Privacy & Policy
  • Contact
NQ NEWS
  • Kiến thức tổng hợp
    • Development
    • Deep Learning
    • Cloud Computing
    • Kiến thức bảo mật
    • Tin học văn phòng
  • Thủ thuật
    • Phần Mềm
    • Sửa lỗi máy tính
    • Bảo mật máy tính
    • Tăng tốc máy tính
    • Thủ thuật Wifi
  • Quản trị hệ thống
    • Giải pháp bảo mật
    • Mail Server
    • Mạng LAN – WAN
    • Máy chủ
    • Windows Server 2012
  • Tin tức
No Result
View All Result
  • Kiến thức tổng hợp
    • Development
    • Deep Learning
    • Cloud Computing
    • Kiến thức bảo mật
    • Tin học văn phòng
  • Thủ thuật
    • Phần Mềm
    • Sửa lỗi máy tính
    • Bảo mật máy tính
    • Tăng tốc máy tính
    • Thủ thuật Wifi
  • Quản trị hệ thống
    • Giải pháp bảo mật
    • Mail Server
    • Mạng LAN – WAN
    • Máy chủ
    • Windows Server 2012
  • Tin tức
No Result
View All Result
NQ NEWS
No Result
View All Result
Home Kiến thức tổng hợp Lập trình

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

@admiz by @admiz
26/12/2021
in Lập trình
0
Da Luong Multithread Trong Cplusplus 640 1

Đ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ốMiêu tả
threadMột định danh duy nhất cho thread mới được trả về bởi chương trình con
attrMộ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_routineChương trình C++ mà thread này sẽ thực thi một khi nó được tạo
argMộ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ụ

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 SO_THREAD 4void *InLoiChao(void *threadid) 
{ 
    cout << "Hello World! Thread ID la " << threadid << endl; 
    pthread_exit(NULL); 
 int main () 
{ 
    pthread_t threads[SO_THREAD]; 
    int rc; 
    int i; 
    for(i=0; i < SO_THREAD; 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); 
 

Nếu bạn đang sử dụng command promt để biên dịch chương trình, thì bạn sử dụng thư viện –lpthread như sau:

$gcc test.cpp -lpthread

Nếu không, biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Kết thúc Thread 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 SO_THREAD     5struct 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[SO_THREAD];
   struct du_lieu td[SO_THREAD];
   int rc;
   int i;   for( i=0; i < SO_THREAD; 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:

Truyền tham số tới Thread 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 SO_THREAD     5void *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[SO_THREAD];
   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 < SO_THREAD; 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 < SO_THREAD; 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:

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

Theo Tutorialspoint

Bài trước: Xử lý tín hiệu (Signal Handling) trong C++

Bài tiếp: Lập trình Web trong C++

  • Dev-C++
  • Tính kế thừa trong C++
Post Views: 193
Tags: Kết hợp và Tháo gỡ các Thread trong C++Kết thúc Thread trong C++Tạo Thread trong C++Truyền tham số tới Thread trong C++
Previous Post

Cách chuyển video sang mp3

Next Post

Hướng dẫn cài TeamViewer, cách sử dụng TeamViewer để điều khiển máy tính từ xa

Related Posts

Dien Tich Tam Giac 640 1
Lập trình

Công thức tính diện tích tam giác: vuông, thường, cân, đều

26/12/2021
Huong Dan Cai Dat Node Js 640 1
Lập trình

Hướng dẫn cài đặt Node.js

26/12/2021
Cau Truc Du Lieu Hang Doi Queue 640 1
Lập trình

Cấu trúc dữ liệu hàng đợi (Queue)

26/12/2021
Hoc Css 640 8
Lập trình

Thanh điều hướng – Navigation Bar trong CSS

26/12/2021
Ms Sql Server Management Studio 640 3
Lập trình

Quản lý MS SQL Server bằng Management Studio

26/12/2021
Java Development Kit 1
Lập trình

Tải Java Development Kit 8-update-281

26/12/2021
Next Post
Teamviewer Dieu Khien 650 1

Hướng dẫn cài TeamViewer, cách sử dụng TeamViewer để điều khiển máy tính từ xa

Bài mới nhất

Dịch Vụ Thiết Kế Website Tại Hải Dương Chuyên Nghiệp, ấn Tượng Và Uy Tín 612d25752b14f.png

Dịch vụ thiết kế website tại Hải Dương chuyên nghiệp, ấn tượng và uy tín

06/05/2025
Top Công Ty Thiết Kế Website Tại Biên Hòa Chuyên Nghiệp, Chuẩn Seo 612d259494e93.jpeg

Top công ty thiết kế website tại Biên Hòa chuyên nghiệp, chuẩn SEO

06/05/2025
Top Công Ty Thiết Kế Website Tại Vinh – Nghệ An Uy Tín 612d259a9cae3.jpeg

Top công ty thiết kế website tại Vinh – Nghệ An uy tín

05/05/2025
Top 10 Công Ty Thiết Kế Website Tại Nha Trang Chuyên Nghiệp 612d0a9ad018b.jpeg

Top 10 công ty thiết kế website tại Nha Trang chuyên nghiệp

05/05/2025
Các Dịch Vụ Thiết Kế Website Tại Vĩnh Phúc Chuyên Nghiệp, Uy Tín Nhất 612d0a91e63af.jpeg

Các dịch vụ thiết kế website tại Vĩnh Phúc chuyên nghiệp, uy tín nhất

04/05/2025

Danh mục

  • Android
  • Bảo mật máy tính
  • Bảo mật, Antivirus
  • Chuyện công nghệ
  • Deep Learning
  • Development
  • Dịch vụ công trực tuyến
  • Dịch vụ nhà mạng
  • Giải pháp bảo mật
  • Hệ thống
  • Hệ thống
  • iPhone
  • Kiến thức bảo mật
  • Kiến thức cơ bản phổ thông
  • Kiến thức Marketing căn bản
  • Kiến thức tổng hợp
  • Lập trình
  • Linux
  • Linux OS
  • macOS
  • Mail Server
  • Mạng LAN – WAN
  • Máy ảo
  • Máy chủ
  • ms excel
  • ms-powerpoint
  • Nền tảng điện toán đám mây
  • Phần cứng
  • Phần Mềm
  • Quản trị hệ thống
  • Raspberry Pi
  • Sửa lỗi máy tính
  • Tăng tốc máy tính
  • Thủ thuật
  • Thủ thuật SEO
  • Thủ thuật Wifi
  • Tiện ích hệ thống
  • Tin học văn phòng
  • Tin tức
  • Uncategorized
  • Ứng dụng
  • Website
  • Windows Server 2012

Thẻ

#app #chatbot #chatbot tự động #CRM #Kiến thức cơ bản #Techblog #Thiết kế website Android apple CPU Email Marketing Google Google Drive hacker HTML hàm python hàm python có sẵn hình nền hình nền máy tính học css học python học SQL ios iphone iphone 12 iPhone X macos Microsoft mssql MS SQL Server ngôn ngữ lập trình python Raspberry Pi Samsung smartphone SQL SQL Server tham số trong C thủ thuật windows 10 tài liệu python windows windows 10 YouTube điện thoại thông minh ứng dụng
  • About
  • Advertise
  • Privacy & Policy
  • Contact

© 2022 Pha Le Solution

No Result
View All Result
  • Home

© 2022 Pha Le Solution