Добавил два варианта add_task с параметрами как у std::bind

This commit is contained in:
selim 2014-09-16 13:09:16 +04:00
parent cb38073236
commit 5417160889
3 changed files with 41 additions and 19 deletions

View File

@ -10,8 +10,8 @@ OS = linux
# C++ compier
CXX = g++
CXXFLAGS = -MMD -c -g -Og -Wall -Werror -std=c++11 -Iinclude -Isrc/asm/include -fno-strict-aliasing #-fsanitize=thread -fPIE
LDFLAGS = -lgtest #-ltsan -pie
CXXFLAGS = -MMD -c -g -Og -Wall -Werror -std=c++11 -Iinclude -Isrc/asm/include -fno-strict-aliasing -fsanitize=thread -fPIE
LDFLAGS = -lgtest -ltsan -pie
# Archiver
AR = ar

View File

@ -30,12 +30,21 @@ public:
std::shared_ptr<std::packaged_task<R()>> pt_ptr = std::make_shared<std::packaged_task<R()>>(func);
std::future<R> fut = pt_ptr->get_future();
std::function<void()> tf = [pt_ptr] { (*pt_ptr)(); };
_queue.push(tf);
_queue.push([pt_ptr] { (*pt_ptr)(); });
_cv.notify_one();
return fut;
}
template <typename R, typename... Args> std::future<R> add_task(R(*pfn)(Args...), Args... args)
{
return add_task<R>(std::bind(pfn, args...));
}
template <typename R, typename C, typename... Args> std::future<R> add_task(R(C::*pfn)(Args...), C* cPtr, Args... args)
{
return add_task<R>(std::bind(pfn, cPtr, args...));
}
private:
void worker_func();
};

View File

@ -574,6 +574,20 @@ void func(std::size_t n)
std::cout << "end of thread " << n << std::endl;
}
int geti(int i)
{
return i;
}
class foo
{
public:
int bar(int n)
{
return n;
}
};
int main(int argc, char **argv)
{
//::testing::InitGoogleTest(&argc, argv);
@ -594,22 +608,21 @@ int main(int argc, char **argv)
threads[i].join();
*/
threadpool pool(4);
threadpool pool(4);
std::vector<std::future<int>> vec;
for (std::size_t i = 0; i < 100; ++i)
{
std::function<int()> func = [i]() -> int {
auto id = std::this_thread::get_id();
std::this_thread::sleep_for(std::chrono::seconds(5));
ulog.log_info("task % with id %", i, id);
return 0;
};
foo f;
for (std::size_t i = 0; i < 100; ++i)
{
//std::future<int> fut = pool.add_task<int>([i] { return i; });
std::future<int> fut = pool.add_task(&foo::bar, &f, (int)i);
vec.push_back(std::move(fut));
}
pool.add_task(func);
}
int n;
std::cin >> n;
for(std::size_t i = 0; i < 100; ++i)
{
std::cout << "res[" << i << "] = " << vec[i].get() << std::endl;
}
return 0;
}