Tôi đã viết một chương trình đã viết và nó không hoạt động như tôi mong đợi. Tôi có hai chủ đề: thread
kích hoạt func
và anotherThread
gây ra anotherFunc
. Những gì tôi muốn làm là khi cont
đạt giá trị 10
trong func
, anotherThread
được kích hoạt bằng cách sử dụng pthread_cond_wait
và pthread_cond_signal
. Điều kỳ lạ là mọi thứ hoạt động tốt nếu tôi bỏ ghi chú dòng sleep(1)
. Tôi mới vào chủ đề và tôi đã làm theo các hướng dẫn here và nếu tôi nhận xét dòng sleep
trong ví dụ của họ nó phá vỡ là tốt.Chủ đề POSIX C. ví dụ pthread_cond_t. Không hoạt động như mong đợi
Câu hỏi của tôi là làm cách nào để tôi có thể thực hiện tác vụ này mà không cần bất kỳ cuộc gọi nào sleep()
? Và điều gì xảy ra nếu trong mã của tôi cả hai số func
, hãy truy cập pthread_mutex_lock
sau anotherFunc
? Làm thế nào tôi có thể kiểm soát những điều này? Đây là mã của tôi:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t myMutex;
pthread_cond_t cond;
pthread_attr_t attr;
int cont;
void *func(void*)
{
printf("func\n");
for(int i = 0; i < 20; i++)
{
pthread_mutex_lock(&myMutex);
cont++;
printf("%d\n", cont);
if(cont == 10)
{
printf("signal:\n");
pthread_cond_signal(&cond);
// sleep(1);
}
pthread_mutex_unlock(&myMutex);
}
printf("Done func\n");
pthread_exit(NULL);
}
void *anotherFunc(void*)
{
printf("anotherFunc\n");
pthread_mutex_lock(&myMutex);
printf("waiting...\n");
pthread_cond_wait(&cond, &myMutex);
cont += 10;
printf("slot\n");
pthread_mutex_unlock(&myMutex);
printf("mutex unlocked anotherFunc\n");
printf("Done anotherFunc\n");
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t thread;
pthread_t anotherThread;
pthread_attr_init(&attr);
pthread_mutex_init(&myMutex, NULL);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_cond_init(&cond, NULL);
pthread_create(&anotherThread, &attr, anotherFunc, NULL);
pthread_create(&thread, &attr, func, NULL);
pthread_join(thread, NULL);
pthread_join(anotherThread, NULL);
printf("Done MAIN()");
pthread_mutex_destroy(&myMutex);
pthread_cond_destroy(&cond);
pthread_attr_destroy(&attr);
pthread_exit(NULL);
return 0;
}
Xin lỗi vì bài viết dài nhưng tôi mới làm chủ đề và tôi sẵn sàng học. Ngoài ra bạn có biết một số tài liệu tham khảo hay các khóa học/hướng dẫn tốt về các chủ đề và kết nối mạng trên Linux không? Tôi muốn học cách tạo một ứng dụng trò chuyện và tôi nghe nói rằng tôi phải biết chủ đề và kết nối mạng cho điều đó. Vấn đề là tôi không biết khá tốt nếu những gì tôi học là ok vì tôi không biết những gì tôi phải biết.
Cảm ơn bạn rất nhiều :)
Các nhận xét khác. Ngoài việc không phải sử dụng 'pthread_attr_t', bạn có thể sử dụng bộ khởi tạo tĩnh cho điều kiện và mutex để đơn giản hóa mã. Hơn nữa, các hàm thread của bạn chỉ có thể trả về NULL, 'hoặc' return 0; 'thay vì gọi' pthread_exit'. Và chủ đề chính của bạn chỉ có thể 'trả về 0;' từ chính mà không gọi 'pthread_exit'. Các chủ đề khác không chạy vào thời điểm đó kể từ khi chúng được tham gia. trở về từ lực lượng chính một quá trình thoát, nhưng 'pthread_exit' trong tiểu học chủ đề không bắt buộc một quá trình xuất cảnh, đó là hữu ích cho việc giữ các chủ đề khác đang chạy. – Kaz
Ngoài ra, không cần phải làm sạch các điều kiện và điều kiện tĩnh. Chỉ cần sử dụng 'pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;'. Khởi tạo phức tạp là cần thiết cho các tình huống mà bạn muốn đặt thuộc tính bất thường. Ví dụ. tạo một mutex mạnh mẽ được chia sẻ theo quy trình. – Kaz