Tôi gặp sự cố với dự án của mình, dự án phải sử dụng một luồng để thêm từng hàng rồi thêm tất cả, nhưng tôi gặp lỗi cho biết rằng giá trị lvalue được yêu cầu dưới dạng toán hạng '&' đơn nhất
pthread_create(&tid, NULL, &sum_line(0), NULL);
Tôi đã thử một vài thứ nhưng không thể tìm ra, có ý tưởng nào không? Cảm ơn
#include
#include
#include
khoảng trống tĩnh * sum_line(int nr_line);
int Tổng;
int A[4][4];
int chính() {
pthread_t thời gian;
Tổng = 0;
printf("\nOrig thread tid(%d) Sum=%d", pthread_self(), Sum);
pthread_create(&tid, NULL, &sum_line(0), NULL);
printf("\nLuồng con đã được tạo tid(%d)", tid);
pthread_join(tid,NULL);
printf("\nOrig thread tid(%d)--> thread con đã kết thúc tid(%d) Sum=%d",pthread_self(), tid, Sum);
printf("\n");
}
khoảng trống tĩnh * sum_line(int nr_line) {
int i;
for(i=0;i<4;i++) {
Tổng=Tổng+A[i];
printf("\nTid thread con(%d), i=%d, Sum=%d",pthread_self(),i,Sum);
ngủ(2);
}
printf("\nTid thread con(%d)--> end", pthread_self());
}
Truyền con trỏ tới hàm pthread_create()
chỉ viếttổng_dòng
,而不是&sum_line(0)
.
pthread_create()
Hàm mong đợi một con trỏ tới hàm luồng—tức là tên hàm—không phải là kết quả của việc gọi hàm. pthread_create()
Hàm lên lịch cho một luồng mới để gọi hàm nhưng yêu cầu một con trỏ hàm.
Ngoài ra, chữ ký của hàm thread phải là:
void *hàm (void *arg);
Hàm cũng phải trả về một giá trị - trước khi thêm dấu ngoặc nhọn đóng return 0;
.
Bạn đang truyền một con trỏ rỗng cho hàm; bạn không thể mong đợi nó giống như vậy; int nr_line
Hoạt động giống nhau. Bạn cần thực hiện một số thao tác chân cầu kỳ để có được các số của hàm số. Có hai lựa chọn chính:
或者
int nr_line = 247;
pthread_create(&tid, NULL, sum_line, &nr_line);
Chức năng này trông như thế này:
void *sum_line(void *arg)
{
int nr_line = *(int *)arg;
…
return 0;
}
Khi bạn bắt đầu nhiều luồng, chỉ cần đảm bảo mỗi luồng nhận được một con trỏ tới một đối tượng khác nhau.
或者
uintptr_t nr_line = 247;
pthread_create(&tid, NULL, sum_line, (void *)nr_line);
或者:
int nr_line = 247;
pthread_create(&tid, NULL, sum_line, (void *)(uintptr_t)nr_line);
Sau đó, chức năng trông giống như:
void *sum_line(void *arg)
{
int nr_line = (uintptr_t)arg;
…
return 0;
}
Chuyển đổi kép tránh cảnh báo của trình biên dịch về việc chuyển đổi các số nguyên có kích thước khác nhau thành con trỏ.
Xin lưu ý rằngpthread_create()
Hàm sẽ được gọi như thể nó được gọi hàm void *(void *args)
Tương tự, vì vậy hãy chuyển bất kỳ loại con trỏ hàm nào khác tới nó, ngay cả khi bạn sử dụng (void (*)(void *))
Thực hiện chuyển đổi sẽ gian lận và gây ra hành vi không xác định.
Tôi là một lập trình viên xuất sắc, rất giỏi!