Truyền giá trị biến giữa 2 thread

Em đang gặp vấn đề về việc truyền dữ liệu runtime giữa 2 thread:
Dùng main() để tạo thread thứ 1: xuất dữ liệu lên màn hình. Sau đó, tạo ra thread thứ 2 : thread này dùng để lấy giá trị thời gian (Khoảng cách về thời gian). Rồi từ thread thứ 1 lấy ra kết quả của thread 2 để xuất dữ liệu lên màn hình.
E đã phát họa thành sơ đồ quy trình .(Nếu chưa hợp lý thì mong mọi người góp ý ạ)
Vấn đề là từ thread thứ 2, em không thể truyền sang thread 1 được ạ.
Vậy em phải làm sao để truyền giá trị giữa 2 thread ?

1 Like

Vấn đề là từ thread thứ 2, em không thể truyền sang thread 1 được ạ.

Không nên cho 2 thread access dữ liệu của nhau. Hãy thiết kế kiểu request-response.
Trên windows thì dùng windows_message.

2 Likes

Thực ra tớ không hiểu cậu đang nói gì :cry:
Cơ mà, khi cậu làm việc với multithread, và muốn share dữ liệu cho nhau giữa các thread, tùy vào use case mà cậu sẽ có thiết kế phù hợp.
Có 1 số pattern phổ biến để implement việc share dữ liệu giữa các thread, như thế này:

  • Dùng event để trao đổi. Tất cả các thread sẽ phải subscribe 1 event dispatcher, khi nào gì cần gửi, cậu gói dữ liệu cần gửi đi, đề cập rõ thread nào sẽ được nhận, và sau đó gửi đi. Event dispatcher sẽ chịu trách nhiệm gửi message sang các thread khác cho cậu.
  • Pub-sub. Gần như event, nhưng thread A subscribe thread B (chứa reference của thread B). Khi thread B có gì thay đổi, sẽ thông báo cho thread A để lấy dữ liệu thay đổi.
  • Các thread có sử dụng chung 1 resource nào đó. Khi nào 1 thread muốn chuyển dữ liệu cho thread còn lại, nó chỉ cần sửa dữ liệu ở khu vực dùng chung, và các thread khác sẽ có bản cập nhật dữ liệu mới ngay lập tức.

Giờ, tớ không nói cậu nên dùng cách nào, vì tớ thực ra không biết cậu muốn giải quyết vấn đề gì. Liệu cậu có thể cho bọn tớ biết cậu thực sự muốn làm gì không? :smile:

Nếu có code demo thì sẽ là tốt nhất.

7 Likes

Tớ làm 1 cái lập lịch trên linux. Cụ thể như sau:
Khi bắt đầu chạy 1 chương trình thì sẽ luôn có thread 1 đến thời gian. Ở thread này, sẽ trả về những kết quả tương ứng với thời gian nó đếm.( 5 giây trả về số 5, 10 giây trả về số 10).
Sau đó, thread 2 sẽ nhận những giá trị này và làm việc 1 cách tự động.
Vì chưa làm được nên code chưa có. Cậu có sample nào ko?

Tớ nghe qua mô tả của cậu, có vẻ tương đối cồng kềnh đấy.
Cậu thực sự định làm gì với chương trình lập lịch đó vậy? Vì biết đâu, có cách dễ dàng hơn cho việc mà cậu định làm :smile:

Tớ e là tớ chưa có sample gì cho việc này. Có lẽ, chúng ta nên thảo luận về vấn đề, trước khi nhảy vào code :smile:

5 Likes

Giống Timer phải không nhỉ?

5 Likes

Đúng kiểu Timer đó bạn @rogp10. Nhưng mình ko biết kiếm ở đâu. Bạn chỉ mình với

Lý do tớ hỏi cậu mục đích của cậu là gì, bởi vì với từng mục đích, cậu sẽ có thiết kế phù hợp. Nhưng vì cậu từ chối đưa ra mục đích thật của cậu là gì, tớ sẽ nói ngắn gọn những điều cần làm cho cậu. Xin hãy hiểu rằng, câu hỏi tìm câu trả lời, và đây là câu trả lời tốt nhất cậu có thể nhận được, với thông tin cậu đưa :slight_smile:

Nếu như cậu cần timer để trigger 1 job khác, cậu chỉ cần đơn giản 1 script đếm giờ (vấn đề cơ bản này cậu chắc làm được rồi, vì cậu không hỏi vấn đề đó), và tại thời điểm thức giấc, nó chỉ cần chạy job cậu cần làm ở background, với parameter là thứ cậu muốn truyền đi, là được (cái này cũng là vấn đề cơ bản, cậu chắc cũng làm được rồi, vì cậu không hỏi vấn đề này). Cách này không tốn nhiều thời gian, implement cũng đơn giản (vì nó là vấn đề cơ bản).
Nếu như cậu cần chạy 1 script tại 1 thời điểm (chính xác tới từng phút), cậu có thể tạo cron job.

Cả 2 điều trên đều không cần phải làm gì phức tạp tới mức truyền dữ liệu giữa 2 threads. Nếu cậu vẫn khăng khăng muốn điều đó, cậu có thể nghiên cứu interrupt, hoặc thiết kế script của cậu theo một trong các mô hình được đề cập ở comment này:

Đây, 1 lần nữa, là vấn đề cơ bản. Nếu như cậu không hiểu được điều tớ đề cập, tớ e là cậu không có đủ kiến thức nền tảng để giải quyết bài toán này :slight_smile:

5 Likes

“Scheduled execution” thôi.

5 Likes

nếu xài C++ thì xài cái này: https://en.cppreference.com/w/cpp/thread/condition_variable

C thì https://elias.rhi.hi.is/libc/Condition-Variables.html

hình như có cách khác lẹ hơn thì phải :V

5 Likes

Cám ơn @library nhé. Có lẽ tớ chưa hiểu hết vấn đề nên bị có những câu hỏi chung chung. Tớ sẽ tiếp tục tìm hiểu thêm. Và trong tương lai, tớ sẽ cố gắng đặt câu hỏi rõ ràng hơn để chúng ta thảo luận.

1 Like

static cái biến đó lên thôi.
static thêm một hoặc vài cái flag.
sử dụng thêm mutex.

3 Likes

Tớ nghĩ do cậu đặt mục tiêu là giải quyết vấn đề nên mới nghĩ theo hướng này.
Cậu có thể nghĩ theo hướng @VTAIT chỉ đang thực hành hiện thực giao tiếp giữa 2 thread, đề bài bạn ấy đặt ra nhằm tạo một target nào đó để code.

Trở lại vấn đề, mình thấy thread 1 không có nhiệm vụ nào khác ngoài việc chờ thread 2. Do đó bạn @VTAIT có thể dùng message queue dạng blocking: Thread 1 chờ queue và always sleep, chờ thread 2 gửi update time thì display.

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