मानक के संभाजक लेने कंस्ट्रक्टर्स promise
/packaged_task
सिर्फ राज्य वस्तु खुद के लिए संभाजक का उपयोग करने वाले हैं, या इस सभी (आंतरिक) से संबंधित वस्तुओं के लिए गारंटी की जानी चाहिए?कस्टम allocators बनाम वादों और पैक कार्यों
[futures.promise]: "... साझा राज्य के लिए स्मृति को आबंटित"
[futures.task.members]: "... आंतरिक डाटा संरचनाओं की दुकान करने के लिए आवश्यक स्मृति को आबंटित"
विशेष रूप से, नीचे दी गई बग या विशेषताएं हैं?
* MSVC 2013.4, बूस्ट 1.57, short_alloc.h by Howard Hinnant
उदाहरण 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;
}
आउटपुट:
...
[promise]
alloc 8
alloc 12
alloc 8
alloc 24
[packaged_task]
alloc 8
alloc 12
alloc 8
alloc 24
Fwiw, डिफ़ॉल्ट संभाजक साथ उत्पादन
...
[promise]
alloc 144
alloc 8
alloc 12
alloc 8
alloc 16
[packaged_task]
alloc 160
alloc 8
alloc 12
alloc 8
alloc 16
है
उदाहरण 2
AFAICT, MSVC के std::mutex
एक अपरिहार्य ढेर आवंटन करता है, और इसलिए, ताकि std::promise
जो इसे इस्तेमाल करता है। क्या यह एक अनुरूप व्यवहार है?
आप अपने नमूना कोड में 'बूस्ट' का उपयोग क्यों कर रहे हैं, और 'std' द्वारा निर्दिष्ट व्यवहार के बारे में बात कर रहे हैं? 'Std' का उपयोग क्यों नहीं करें? – Yakk
@Yakk: http://www.boost.org/doc/libs/1_57_0/doc/html/thread/compliance.html – vpozdyayev
@Yakk: इसके अलावा, मैंने std कोशिश की; उदाहरण 2 देखें। दरअसल, मैंने पहले std की कोशिश की, फिर कस्टम आवंटक के अधिक उपयोग की उम्मीद में बढ़ावा देने के लिए बदल गया --- लेकिन हां। – vpozdyayev