Tôi có một ứng dụng đơn giản có giao diện với phần cứng khác nhau. Đối với mỗi phần cứng, tôi đã tạo một pthread_t
, có tổng cộng 6 luồng: 1 luồng quản lý và 5 luồng công nhân.
Mỗi luồng có một quy trình khởi tạo chung để chờ luồng quản lý đánh thức nó thông qua:
pthread_mutex_lock(&mMutex);
pthread_cond_wait(&mMutex, &condVar);
pthread_mutex_lock(&mMutex);
Sau đó, luồng chính sẽ đánh thức tất cả các luồng bằng cách gửi tín hiệu đến từng luồng một:
pthread_cond_wait(&mMutex1, &condVar1);
pthread_cond_wait(&mMutex2, &condVar2);
...
pthread_cond_wait(&mMutex5, &condVar5);
Mã thực sự hoạt động tốt, nhưng đó là vì tôi đã may mắn chọn đúng thời điểm. Khi luồng chính/quản lý có vấn đề pthread_cond_signal
Có một khả năng nhỏ nhưng thực tế là luồng vẫn chưa hoàn tất quá trình khởi tạo. Tôi cần tìm cách đảm bảo rằng mỗi biến điều kiện có một lệnh gọi lại bằng chuỗi công việc riêng của nó Chờ đợi
gọi.
Tôi luôn có thể tạo một giá trị bool trạng thái được đặt trong mutex tương ứng, nhưng tôi không thể thực thi cả hai một cách nguyên tử trong một lệnh set
Và Chờ đợi
Hoạt động, theo như tôi biết. Tôi cũng có thể sử dụng pthread_barrier_t
, nhưng điều này chỉ có thể đảm bảo rằng tất cả các luồng đang hoạt động Chờ đợi
Cuộc gọi được bắt đầu bằng một hoặc hai hướng dẫn.
Có cách nào đã được chứng minh để xác định Chờ đợi
Cuộc gọi đã hoàn thành hay tôi cần sử dụng vòng lặp/kiểm tra theo thời gian nào đó?
Cảm ơn.
Tôi luôn có thể tạo một boolean trạng thái được đặt trong mutex tương ứng, nhưng về mặt nguyên tử, tôi không thể thực hiện cả thao tác đặt và thao tác chờ trong một lệnh, theo như tôi biết.
Đó là điều đúng đắn phải làm - bạnCó thểCác thao tác đặt và chờ được thực hiện một cách nguyên tử do cách các biến điều kiện tương tác với khóa mutex. Khi bạn thực thi pthread_cond_wait()
Khi vận hành, bạn必须Khóa mutex bạn đã truyền vào. Nếu bạn đang thực hiện pthread_cond_signal()
Nếu cùng một mutex bị khóa tương ứng, luồng chờ sẽ không thức dậy cho đến khi luồng báo hiệu mở khóa mutex.
Vì vậy, đoạn mã sau sẽ làm những gì bạn muốn:
// Cờ cho biết luồng công nhân có đang chờ hay không
bool chờ = sai;
...
// Mã luồng công nhân
... làm những việc...
trong khi (!condition_is_not_satisfied())
{
pthread_mutex_lock(&mutex);
chờ đợi = đúng;
pthread_cond_wait(&cond, &mutex);
chờ đợi = sai;
pthread_mutex_unlock(&mutex);
}
...
// Mã luồng báo hiệu
pthread_mutex_lock(&mutex);
nếu (chờ)
{
// Luồng công nhân đang chờ -- báo hiệu cho nó thức dậy
pthread_cond_signal(&cond);
}
khác
{
// Luồng công nhân chưa vào trạng thái chờ -- hãy làm việc khác
}
pthread_mutex_unlock(&mutex);
Tôi là một lập trình viên xuất sắc, rất giỏi!