Sau this excellent tutorial cho tương lai, lời hứa và nhiệm vụ đóng gói tôi đã đến điểm mà tôi muốn chuẩn bị nhiệm vụ của riêng tôiLàm cách nào để tạo gói packaged_task với các tham số?
#include <iostream>
#include <future>
using namespace std;
int ackermann(int m, int n) { // might take a while
if(m==0) return n+1;
if(n==0) return ackermann(m-1,1);
return ackermann(m-1, ackermann(m, n-1));
}
int main() {
packaged_task<int(int,int)> task1 { &ackermann, 3, 11 }; // <- error
auto f1 = task1.get_future();
thread th1 { move(task1) }; // call
cout << " ack(3,11):" << f1.get() << endl;
th1.join();
}
Theo như tôi có thể giải mã gcc-4.7.0 thông báo lỗi nó mong đợi các đối số khác nhau? Nhưng bằng cách nào? Tôi cố gắng để rút ngắn được thông báo lỗi:
error: no matching function for call to
'std::packaged_task<int(int, int)>::packaged_task(<brace-enclosed initializer list>)'
note: candidates are:
std::packaged_task<_Res(_ArgTypes ...)>::---<_Res(_ArgTypes ...)>&&) ---
note: candidate expects 1 argument, 3 provided
...
note: cannot convert 'ackermann'
(type 'int (*)(int, int)') to type 'std::allocator_arg_t'
là biến thể của tôi như thế nào tôi cung cấp các tham số cho ackermann
sai? Hoặc thông số mẫu không đúng? Tôi không đưa ra các tham số 3,11
để tạo chủ đề, đúng không?
Cập nhật biến không thành công khác:
packaged_task<int()> task1 ([]{return ackermann(3,11);});
thread th1 { move(task1) };
packaged_task<int()> task1 (bind(&ackermann,3,11));
thread th1 { move(task1) };
packaged_task<int(int,int)> task1 (&ackermann);
thread th1 { move(task1), 3,11 };
hmm ... là nó với tôi, hoặc là nó beta-gcc?
Xem xét các yêu cầu đối với 'std :: bind', không đúng là các đối số được yêu cầu phải có thể sao chép được. Đoạn văn quá dài để dán ở đây, nó là 20.8.9.1.2 Mẫu chức năng liên kết [func.bind.bind] đoạn 5. Các yêu cầu thực tế là các kiểu được lưu trữ được di chuyển có thể xây dựng và có thể xây dựng được từ các đối số đã truyền. Mặc dù tôi nhớ một vận chuyển thực hiện bị lỗi với GCC đã yêu cầu CopyConstructible. (Tuy nhiên, không phải vấn đề mà OP phải đối mặt.) –
@Luc: bạn nói đúng, tôi đã sai. –
Mã hoạt động, nhưng tôi có một câu hỏi trong dòng 'std :: unique_lock l (td.m);' không phải là mutex trong chuỗi đã bị khóa khi nó đang kiểm tra biến điều kiện? Tôi nghĩ rằng tôi đang thiếu một cái gì đó ở đó. Tôi nghĩ rằng nó khóa mutex trong thread và sau đó chờ cho lá cờ dừng hoặc cho công việc được thêm vào hàng đợi. Trong trường hợp này sẽ không phải là chủ đề chính tiếp tục chờ đợi cho khóa để phát hành? Đây có phải là vì một sự thức tỉnh giả mạo rằng điều này hoạt động? –
bjackfly