Đa luồng là gì, hoạt động như thế nào?

Mọi người ơi, mình đọc tài liệu mà vẫn chưa rõ đa luồng hoạt động như thế nào.

  1. PTHREAD_MUTEX_INITIALIZER có ý nghĩa gì?
  2. Luồng thread1 và thread2 là thực hiện nối tiếp nhau, giả sử không dùng thread, mà mình sử dụng hai hàm funC và funC1 như các hàm bình thường và gọi nó theo thứ tự, thì nó khác gì khi sử dụng đa luồng?
    Mọi người có thời gian thì trao đổi cùng mình nhé!
#include "pthread.h"
#include <stdio.h>
#include <conio.h>

int couter = 0;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
void * funcC(void *data)
{
	pthread_mutex_lock(&mutex1);
	couter += 100;
	printf("Gia tri couter trong Func:%d\n",couter);
	pthread_mutex_unlock(&mutex1);//mở khoá biến mutex. Một lỗi trả về nếu mutex đã mở khoá hoặc được sở hữu của một thread khác.
	//Khoá việc truy cập các biến của các thead khác. Do đó thực thi này có toàn quyeenf truy cập và thiết lập cho các biến
	return NULL;
}
void * funcC1(void *data)
{
	pthread_mutex_lock(&mutex1);
	couter += 200;
	printf("Gia tri couter trong Func1:%d\n",couter);
	pthread_mutex_unlock(&mutex1);
	return NULL;
}
int main(int argc, char * argv[])
{
	pthread_t thread1, thread2;
	pthread_create(&thread1,NULL,&funcC,NULL);
	pthread_create(&thread2,NULL,&funcC1,NULL);
	pthread_join(thread1,NULL);
	pthread_join(thread2,NULL);
	printf("Gia tri cuoi cung cua counter: %d\n",couter);
	getch();
	return 0;
}
1 Like

Khi người ta muốn làm nhiều việc cùng 1 lúc
Ví dụ như Tấm bị gì ghẻ bắt phải lựa hột é với mè đen (task 1) xong mới cho đi dự dạ hội (task 2)
thì lúc này ông bụt (dev) kêu mấy con chim lựa hột é với mè đen (tạo ra 1 thread mới để thực hiện task 1), còn Tấm thì không cần làm chuyện đó nữa mà chỉ việc lên đồ và đi quẩy thôi (task 2)
12h đêm dì ghẻ về thì thấy hột é với mè đen đã lựa xong (do con chim làm, có khi lũ chim ăn hết hột :)) ) trong khi thực tế tấm vẫn đi quẩy cùng hoàng tử (và bỏ quên chiếc dép)
Trong thực tế khi viết code sẽ có lúc chúng ta cần tăng tốc xử lý bằng cách tạo ra thread mới để làm một số việc nào đó để thread chính không bị block (thay vì Tấm phải lựa xong đóng hạt mới được đi quẩy thì lựa xong là ăn cám luôn chứ khỏi đi nữa), tất nhiên là thường áp dụng cho những task có thể hoạt động độc lập song song

rảnh rỗi chém gió cho vui vậy thôi, còn bạn hiểu không thì hên xui, học mà ví dụ si đa quá thì làm sao mà hiểu được :))
thực tế người ta không làm giống như trong ví dụ vô nghĩa trên

6 Likes

Đồng bộ và không đồng bộ. :thinking:

4 Likes

Lấy ví dụ bạn đi siêu thị mua đồ xong ra tính tiền, xui cho bạn là trước mặt bạn có 1 người mua 1000 items, trong khi bạn chỉ mua 1 item.
Trong trường hợp không có đa luồng, tất nhiên bạn phải chờ rất lâu để đc tính tiền, trong khi nếu tính cho bạn trước chỉ mất ko quá 1 phút rồi có thể tính tiếp cho người mua 1000 item kia
Nếu đa luồng thì tất nhiên là bạn có thể tính song song với người mua 1000 item kìa, và thế là nhanh gọn lẹ

5 Likes

Cách tạo mutex bằng pthread_mutex_init() chỉ có thể khoá các biến không phải là static, hay là chỉ sử dụng với các biến cục bộ (biến được khai báo trong hàm).

Biến couter được khai báo ngoài tất cả các hàm, hay biến toàn cục (global variable). Biến toàn cục cũng là biến loại static. Do đó, mutex tạo bằng pthread_mutex_init() không thể khoá được biến couter.

Để có thể khoá biến couter, thì sử dụng mutex được cung cấp sẵn thông qua constant PTHREAD_MUTEX_INITIALIZER. Mutex của constant cho phép truy xuất các biến static.

Vì cả 2 thread đều cũng sử dụng dùng 1 mutex nên nó chạy lần lượt nha. Chỉ khác nhau chỉ ở thứ tự thực hiện.

Cách gọi bình thường:

funcC();
funcC1();

funcC luôn chạy trước funcC1

Cách sử dụng thread:

pthread_create(&thread1,NULL,&funcC,NULL);
pthread_create(&thread2,NULL,&funcC1,NULL);

Trình tự chạy không thể xác định được, có thể funcC chạy trước funcC1, hoặc funcC1 chạy trước funcC.

7 Likes

Tại sao không thể xác định được trình tự chạy của funcCfuncC1 vậy @hungaya

Đường 2 làn mạnh thằng nào thằng đó chạy thôi.

3 Likes

đa số các trường hợp thì thread nào start trước thì sẽ được chạy trước. Tuy nhiên chả có gì đảm bảo cả. Có nhiều khả năng thread 2 lại bắt đầu trước.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?