Добавил два варианта 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 # C++ compier
CXX = g++ CXX = g++
CXXFLAGS = -MMD -c -g -Og -Wall -Werror -std=c++11 -Iinclude -Isrc/asm/include -fno-strict-aliasing #-fsanitize=thread -fPIE CXXFLAGS = -MMD -c -g -Og -Wall -Werror -std=c++11 -Iinclude -Isrc/asm/include -fno-strict-aliasing -fsanitize=thread -fPIE
LDFLAGS = -lgtest #-ltsan -pie LDFLAGS = -lgtest -ltsan -pie
# Archiver # Archiver
AR = ar 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::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::future<R> fut = pt_ptr->get_future();
std::function<void()> tf = [pt_ptr] { (*pt_ptr)(); }; _queue.push([pt_ptr] { (*pt_ptr)(); });
_queue.push(tf);
_cv.notify_one(); _cv.notify_one();
return fut; 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: private:
void worker_func(); void worker_func();
}; };

View File

@ -574,6 +574,20 @@ void func(std::size_t n)
std::cout << "end of thread " << n << std::endl; 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) int main(int argc, char **argv)
{ {
//::testing::InitGoogleTest(&argc, argv); //::testing::InitGoogleTest(&argc, argv);
@ -595,21 +609,20 @@ int main(int argc, char **argv)
*/ */
threadpool pool(4); threadpool pool(4);
std::vector<std::future<int>> vec;
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));
}
for(std::size_t i = 0; i < 100; ++i) for(std::size_t i = 0; i < 100; ++i)
{ {
std::function<int()> func = [i]() -> int { std::cout << "res[" << i << "] = " << vec[i].get() << std::endl;
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;
};
pool.add_task(func);
} }
int n;
std::cin >> n;
return 0; return 0;
} }