#include <iostream>
#include <mutex>
#include <functional>
#include <future>
#include <thread>
#include <chrono>
#include <random>
/** /
template<class R>
R Semaphore(const std::function<R(void)>& F) {
static std::mutex M;
std::lock_guard<std::mutex> L(M);
return F();
}/**/
template<class R,class... Arg>
R Semaphore(const std::function<R(Arg&...)>& F,const Arg& ...A) {// a good semaphoe.but compile.
static std::mutex M;
std::lock_guard<std::mutex> L(M);
return F(A...);
}/**/
template<class R>
R Semaphore2(const std::function<R(void)>& F,std::mutex M) {
// static std::mutex M;
std::lock_guard<std::mutex> L(M);
return F();
}
/**/
int main() {
std::mutex M;
std::mt19937 Rnd;
std::uniform_int_distribution<> U(-3, 3);
/** /
for (std::size_t i = 0; i < 128; i++) {
auto F = [i]()->bool {std::cout << i << std::endl; return true; };
Semaphore<bool>(F);
}
/**/
for (std::size_t i = 0; i < 12800; i++) {
auto F = [i]()->bool {std::cout << i << std::endl; return true; };
// Semaphore<bool>(F);
// auto FU = std::async(std::launch::async, Semaphore<bool>, F);//compiler cant solve to some of same name functions issue.
auto FU = std::async(std::launch::async, Semaphore<bool>, F,10);//compiler cant solve template argements issue.
// auto FU = std::async(std::launch::async, [F]() {return Semaphore(F); });//why not...
// auto FU = std::async(std::launch::async, [](auto F) {Semaphore<bool>(F); std::this_thread::sleep_for(std::chrono::nanoseconds(3)); return true; }, F);
// auto FU = std::async(std::launch::async, [i]() {std::cout << i << std::endl; });//why not...
// auto FU = std::async(std::launch::async, [](auto i) {std::cout << i << std::endl; },i);//why not...
// auto FU = std::async(std::launch::async, [](auto F,auto R) {Semaphore<bool>(F); std::this_thread::sleep_for(std::chrono::milliseconds(R)); return true; }, F,U(Rnd));
}
std::this_thread::sleep_for(std::chrono::seconds(3));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bXV0ZXg+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8ZnV0dXJlPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8cmFuZG9tPgoKLyoqIC8KdGVtcGxhdGU8Y2xhc3MgUj4KUiBTZW1hcGhvcmUoY29uc3Qgc3RkOjpmdW5jdGlvbjxSKHZvaWQpPiYgRikgewoJc3RhdGljIHN0ZDo6bXV0ZXggTTsKCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMKE0pOwoJcmV0dXJuIEYoKTsKfS8qKi8KdGVtcGxhdGU8Y2xhc3MgUixjbGFzcy4uLiBBcmc+ClIgU2VtYXBob3JlKGNvbnN0IHN0ZDo6ZnVuY3Rpb248UihBcmcmLi4uKT4mIEYsY29uc3QgQXJnJiAuLi5BKSB7Ly8gYSBnb29kIHNlbWFwaG9lLmJ1dCBjb21waWxlLgoJc3RhdGljIHN0ZDo6bXV0ZXggTTsKCXN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMKE0pOwoJcmV0dXJuIEYoQS4uLik7Cn0vKiovCnRlbXBsYXRlPGNsYXNzIFI+ClIgU2VtYXBob3JlMihjb25zdCBzdGQ6OmZ1bmN0aW9uPFIodm9pZCk+JiBGLHN0ZDo6bXV0ZXggTSkgewovLwlzdGF0aWMgc3RkOjptdXRleCBNOwoJc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IEwoTSk7CglyZXR1cm4gRigpOwp9Ci8qKi8KaW50IG1haW4oKSB7CglzdGQ6Om11dGV4IE07CglzdGQ6Om10MTk5MzcgUm5kOwoJc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248PiBVKC0zLCAzKTsKCS8qKiAvCglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKCWF1dG8gRiA9IFtpXSgpLT5ib29sIHtzdGQ6OmNvdXQgPDwgaSA8PCBzdGQ6OmVuZGw7IHJldHVybiB0cnVlOyB9OwoJU2VtYXBob3JlPGJvb2w+KEYpOwoJfQoJLyoqLwoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IDEyODAwOyBpKyspIHsKCQlhdXRvIEYgPSBbaV0oKS0+Ym9vbCB7c3RkOjpjb3V0IDw8IGkgPDwgc3RkOjplbmRsOyByZXR1cm4gdHJ1ZTsgfTsKCS8vCVNlbWFwaG9yZTxib29sPihGKTsKCS8vCWF1dG8gRlUgPSBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgU2VtYXBob3JlPGJvb2w+LCBGKTsvL2NvbXBpbGVyIGNhbnQgc29sdmUgdG8gc29tZSBvZiBzYW1lIG5hbWUgZnVuY3Rpb25zIGlzc3VlLgoJCWF1dG8gRlUgPSBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgU2VtYXBob3JlPGJvb2w+LCBGLDEwKTsvL2NvbXBpbGVyIGNhbnQgc29sdmUgdGVtcGxhdGUgYXJnZW1lbnRzIGlzc3VlLgoJCS8vCWF1dG8gRlUgPSBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgW0ZdKCkge3JldHVybiBTZW1hcGhvcmUoRik7IH0pOy8vd2h5IG5vdC4uLgoJLy8JYXV0byBGVSA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCBbXShhdXRvIEYpIHtTZW1hcGhvcmU8Ym9vbD4oRik7IAlzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKDMpKTsgcmV0dXJuIHRydWU7IH0sIEYpOwoJCS8vCWF1dG8gRlUgPSBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgW2ldKCkge3N0ZDo6Y291dCA8PCBpIDw8IHN0ZDo6ZW5kbDsgfSk7Ly93aHkgbm90Li4uCgkJLy8JYXV0byBGVSA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCBbXShhdXRvIGkpIHtzdGQ6OmNvdXQgPDwgaSA8PCBzdGQ6OmVuZGw7IH0saSk7Ly93aHkgbm90Li4uCgkvLwlhdXRvIEZVID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIFtdKGF1dG8gRixhdXRvIFIpIHtTZW1hcGhvcmU8Ym9vbD4oRik7IAlzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhSKSk7IHJldHVybiB0cnVlOyB9LCBGLFUoUm5kKSk7Cgl9CglzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMykpOwoJcmV0dXJuIDA7Cn0=
prog.cpp: In function ‘int main()’:
prog.cpp:43:65: error: no matching function for call to ‘async(std::launch, <unresolved overloaded function type>, main()::<lambda()>&, int)’
auto FU = std::async(std::launch::async, Semaphore<bool>, F,10);//compiler cant solve template argements issue.
^
In file included from prog.cpp:4:
/usr/include/c++/8/future:1712:5: note: candidate: ‘template<class _Fn, class ... _Args> std::future<typename std::result_of<typename std::decay<_Tp>::type(typename std::decay<_Args>::type ...)>::type> std::async(std::launch, _Fn&&, _Args&& ...)’
async(launch __policy, _Fn&& __fn, _Args&&... __args)
^~~~~
/usr/include/c++/8/future:1712:5: note: template argument deduction/substitution failed:
/usr/include/c++/8/future: In substitution of ‘template<class _Fn, class ... _Args> std::future<typename std::result_of<typename std::decay<_Tp>::type(typename std::decay<_Args>::type ...)>::type> std::async(std::launch, _Fn&&, _Args&& ...) [with _Fn = bool (&)(const std::function<bool()>&); _Args = {main()::<lambda()>&, int}]’:
prog.cpp:43:65: required from here
/usr/include/c++/8/future:1712:5: error: no type named ‘type’ in ‘class std::result_of<bool (*(main()::<lambda()>, int))(const std::function<bool()>&)>’
/usr/include/c++/8/future:1745:5: note: candidate: ‘template<class _Fn, class ... _Args> std::future<typename std::result_of<typename std::decay<_Tp>::type(typename std::decay<_Args>::type ...)>::type> std::async(_Fn&&, _Args&& ...)’
async(_Fn&& __fn, _Args&&... __args)
^~~~~
/usr/include/c++/8/future:1745:5: note: template argument deduction/substitution failed:
/usr/include/c++/8/future: In substitution of ‘template<class _Fn, class ... _Args> std::future<typename std::result_of<typename std::decay<_Tp>::type(typename std::decay<_Args>::type ...)>::type> std::async(_Fn&&, _Args&& ...) [with _Fn = std::launch; _Args = {bool (&)(const std::function<bool()>&), main()::<lambda()>&, int}]’:
prog.cpp:43:65: required from here
/usr/include/c++/8/future:1745:5: error: no type named ‘type’ in ‘class std::result_of<std::launch(bool (*)(const std::function<bool()>&), main()::<lambda()>, int)>’