Добавил два варианта add_task с параметрами как у std::bind
This commit is contained in:
parent
cb38073236
commit
5417160889
4
Makefile
4
Makefile
@ -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
|
||||||
|
|||||||
@ -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();
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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)
|
for (std::size_t i = 0; i < 100; ++i)
|
||||||
{
|
{
|
||||||
std::function<int()> func = [i]() -> int {
|
//std::future<int> fut = pool.add_task<int>([i] { return i; });
|
||||||
auto id = std::this_thread::get_id();
|
std::future<int> fut = pool.add_task(&foo::bar, &f, (int)i);
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(5));
|
vec.push_back(std::move(fut));
|
||||||
ulog.log_info("task % with id %", i, id);
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
pool.add_task(func);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int n;
|
for(std::size_t i = 0; i < 100; ++i)
|
||||||
std::cin >> n;
|
{
|
||||||
|
std::cout << "res[" << i << "] = " << vec[i].get() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user