aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely.gcc@gmail.com>2013-12-08 22:18:19 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2013-12-08 22:18:19 +0000
commitda18dcc13337dc0e410b93548f41f91175aeb5a8 (patch)
tree1b10de67d14a2f0f7e219cd654f11f9b8924e4f9
parent7337ddf4bfe0544121c8735624f90b6bc6bc33c3 (diff)
downloadgcc-da18dcc13337dc0e410b93548f41f91175aeb5a8.zip
gcc-da18dcc13337dc0e410b93548f41f91175aeb5a8.tar.gz
gcc-da18dcc13337dc0e410b93548f41f91175aeb5a8.tar.bz2
* testsuite/30_threads/async/async.cc: Fix race condition in test.
From-SVN: r205795
-rw-r--r--libstdc++-v3/ChangeLog4
-rw-r--r--libstdc++-v3/testsuite/30_threads/async/async.cc25
2 files changed, 14 insertions, 15 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index a814fd5..b9536b4 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,7 @@
+2013-12-08 Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ * testsuite/30_threads/async/async.cc: Fix race condition in test.
+
2013-12-08 Paolo Carlini <paolo.carlini@oracle.com>
* testsuite/20_util/add_const/requirements/explicit_instantiation.cc:
diff --git a/libstdc++-v3/testsuite/30_threads/async/async.cc b/libstdc++-v3/testsuite/30_threads/async/async.cc
index 1f94494..05fd23c 100644
--- a/libstdc++-v3/testsuite/30_threads/async/async.cc
+++ b/libstdc++-v3/testsuite/30_threads/async/async.cc
@@ -29,23 +29,18 @@
using namespace std;
-struct work {
- typedef void result_type;
- void operator()(mutex& m, condition_variable& cv)
- {
- unique_lock<mutex> l(m);
- cv.notify_one();
- }
-};
+void work(mutex& m)
+{
+ unique_lock<mutex> l(m);
+}
void test01()
{
mutex m;
- condition_variable cv;
unique_lock<mutex> l(m);
- future<void> f1 = async(launch::async, work(), ref(m), ref(cv));
- cv.wait(l);
- f1.get();
+ future<void> f1 = async(launch::async, &work, ref(m));
+ l.unlock(); // allow async thread to proceed
+ f1.get(); // wait for it to finish
}
void test02()
@@ -53,15 +48,15 @@ void test02()
bool test __attribute__((unused)) = true;
mutex m;
- condition_variable cv;
unique_lock<mutex> l(m);
- future<void> f1 = async(launch::async, work(), ref(m), ref(cv));
+ future<void> f1 = async(launch::async, &work, ref(m));
std::future_status status;
status = f1.wait_for(std::chrono::milliseconds(1));
VERIFY( status == std::future_status::timeout );
status = f1.wait_until(std::chrono::system_clock::now());
VERIFY( status == std::future_status::timeout );
- cv.wait(l);
+ l.unlock(); // allow async thread to proceed
+ f1.wait(); // wait for it to finish
status = f1.wait_for(std::chrono::milliseconds(0));
VERIFY( status == std::future_status::ready );
status = f1.wait_until(std::chrono::system_clock::now());