Open lordnn opened 2 years ago
this worked
#include "ThreadPool.h"
#include <cstdint>
#include <stdio.h>
class Foo {
public:
Foo();
void Process(std::unique_ptr<uint16_t[]> im);
private:
void ProcessImpl(std::shared_ptr<uint16_t[]> im);
ThreadPool t;
};
Foo::Foo() : t(4) {
}
void Foo::Process(std::unique_ptr<uint16_t[]> im) {
#if 0
ProcessImpl(std::move(im));
#else
std::shared_ptr<uint16_t[]> p = std::move(im);
t.enqueue(&Foo::ProcessImpl, this, std::move(p));
#endif
}
void Foo::ProcessImpl(std::shared_ptr<uint16_t[]> im) {
printf("%p %ld\n", im.get(), im.use_count());
}
int main()
{
Foo f;
auto p = std::make_unique<uint16_t[]>(100);
printf("%p\n", p.get());
f.Process(std::move(p));
}
out:
0x10fe3f0
0x10fe3f0 2
So, problem with passing std::unique_ptr still here. :(
@lordnn change fn Process like this will use
void Foo::Process(std::unique_ptr<uint16_t[]> im) {
#if 0
ProcessImpl(std::move(im));
#else
auto f = [this, p = std::move(im)]() mutable {
this->ProcessImpl(std::move(p));
};
t.enqueue(std::move(f));
#endif
}
explaining are here https://stackoverflow.com/questions/8640393/move-capture-in-lambda/20669290#20669290
This doesn't compile.