Are các nhà thầu cấp phát-lấy tiêu chuẩn promise
/packaged_task
phải sử dụng cấp phát cho chỉ đối tượng trạng thái riêng của mình, hoặc điều này nên được đảm bảo cho tất cả (nội bộ) đối tượng liên quan?allocators Tuỳ chỉnh so với lời hứa và nhiệm vụ đóng gói
[futures.promise]: "... phân bổ bộ nhớ cho tình trạng chia sẻ"
[futures.task.members]: "... phân bổ bộ nhớ cần thiết để lưu trữ các cấu trúc dữ liệu nội bộ"
Cụ thể là các lỗi hoặc tính năng dưới đây?
* MSVC 2013,4, Tăng 1,57, short_alloc.h by Howard Hinnant
Ví dụ 1
#define BOOST_THREAD_VERSION 4
#include <boost/thread/future.hpp>
#include "short_alloc.h"
#include <cstdio>
void *operator new(std::size_t s) {
printf("alloc %Iu\n", s);
return malloc(s);
}
void operator delete(void *p) {
free(p);
}
int main() {
const int N = 1024;
arena<N> a;
short_alloc< int, N > al(a);
printf("[promise]\n");
auto p = boost::promise<int>(std::allocator_arg, al);
p.set_value(123);
printf("[packaged_task]\n");
auto q = boost::packaged_task< int() >(std::allocator_arg, al, [] { return 123; });
q();
return 0;
}
Output:
...
[promise]
alloc 8
alloc 12
alloc 8
alloc 24
[packaged_task]
alloc 8
alloc 12
alloc 8
alloc 24
FWIW, đầu ra bằng bộ cấp mặc định là
...
[promise]
alloc 144
alloc 8
alloc 12
alloc 8
alloc 16
[packaged_task]
alloc 160
alloc 8
alloc 12
alloc 8
alloc 16
Ví dụ 2
AFAICT, MSVC của std::mutex
không phân bổ đống không thể tránh khỏi, và do đó, thì std::promise
trong đó sử dụng nó. Đây có phải là hành vi tuân thủ không?
Tại sao bạn sử dụng 'boost' trong mã mẫu của mình và nói về hành vi được chỉ định bởi' std'? Tại sao không sử dụng 'std'? – Yakk
@Yakk: http://www.boost.org/doc/libs/1_57_0/doc/html/thread/compliance.html – vpozdyayev
@Yakk: Ngoài ra, tôi đã thử std; xem ví dụ 2. Trên thực tế, tôi đã thử std đầu tiên, sau đó quay để tăng với hy vọng nhận được sử dụng nhiều hơn của các cấp phát tùy chỉnh --- nhưng than ôi. – vpozdyayev