summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/thread/test/test_11611.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/thread/test/test_11611.cpp')
-rw-r--r--src/boost/libs/thread/test/test_11611.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/boost/libs/thread/test/test_11611.cpp b/src/boost/libs/thread/test/test_11611.cpp
new file mode 100644
index 000000000..0a38b4b27
--- /dev/null
+++ b/src/boost/libs/thread/test/test_11611.cpp
@@ -0,0 +1,66 @@
+// Copyright (C) 2014 Vicente Botet
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#define BOOST_THREAD_VERSION 4
+
+#include <iostream>
+
+#define BOOST_THREAD_PROVIDES_FUTURE
+#define BOOST_THREAD_PROVIDES_EXECUTORS
+#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
+
+#if __cplusplus >= 201103L
+#include <boost/thread/executors/loop_executor.hpp>
+#include <boost/thread/executors/serial_executor.hpp>
+#endif
+#include <boost/thread/thread.hpp>
+#include <boost/atomic.hpp>
+
+using namespace std;
+
+int main()
+{
+#if __cplusplus >= 201103L
+ static std::size_t const nWorks = 100000;
+ boost::atomic<unsigned> execCount(0u);
+ boost::loop_executor ex;
+
+ boost::thread t([&ex]()
+ {
+ ex.loop();
+ });
+
+ {
+ boost::serial_executor serial(ex);
+
+ for (size_t i = 0; i < nWorks; i++)
+ serial.submit([i, &execCount] {
+ //std::cout << i << ".";
+ ++execCount;
+ });
+
+ serial.close();
+ }
+ unsigned const cnt = execCount.load();
+ if (cnt != nWorks) {
+ // Since the serial_executor is closed, all work should have been done,
+ // even though the loop_executor ex is not.
+ std::cerr << "Only " << cnt << " of " << nWorks << " works executed!\n";
+ return 1;
+ }
+
+ if (ex.try_executing_one()) {
+ std::cerr
+ << "loop_executor::try_executing_one suceeded on closed executor!\n";
+ return 1;
+ }
+
+ ex.close();
+
+ t.join();
+ std::cout << "end\n" << std::endl;
+#endif
+ return 0;
+}