void test_if_other_thread_has_write_lock_try_lock_upgrade_returns_false()
{

    boost::shared_mutex rw_mutex;
    boost::mutex finish_mutex;
    boost::mutex unblocked_mutex;
    unsigned unblocked_count=0;
    boost::mutex::scoped_lock finish_lock(finish_mutex);
    boost::thread writer(simple_writing_thread(rw_mutex,finish_mutex,unblocked_mutex,unblocked_count));
    boost::this_thread::sleep(boost::posix_time::seconds(1));
    CHECK_LOCKED_VALUE_EQUAL(unblocked_mutex,unblocked_count,1u);

    bool const try_succeeded=rw_mutex.try_lock_upgrade();
    BOOST_CHECK(!try_succeeded);
    if(try_succeeded)
    {
        rw_mutex.unlock_upgrade();
    }

    finish_lock.unlock();
    writer.join();
}
 void operator()()
 {
     // acquire lock
     lock_type lock(rw_mutex);
         
     // increment count to show we're unblocked
     {
         boost::mutex::scoped_lock ublock(unblocked_count_mutex);
         ++unblocked_count;
         unblocked_condition.notify_one();
         ++simultaneous_running_count;
         if(simultaneous_running_count>max_simultaneous_running)
         {
             max_simultaneous_running=simultaneous_running_count;
         }
     }
         
     // wait to finish
     boost::mutex::scoped_lock finish_lock(finish_mutex);
     {
         boost::mutex::scoped_lock ublock(unblocked_count_mutex);
         --simultaneous_running_count;
     }
 }
Ejemplo n.º 3
0
void test_can_lock_upgrade_if_currently_locked_shared()
{
    typedef hpx::lcos::local::shared_mutex shared_mutex_type;
    typedef hpx::lcos::local::mutex mutex_type;

    test::thread_group pool;

    shared_mutex_type rw_mutex;
    unsigned unblocked_count = 0;
    unsigned simultaneous_running_count = 0;
    unsigned max_simultaneous_running = 0;
    mutex_type unblocked_count_mutex;
    hpx::lcos::local::condition_variable unblocked_condition;
    mutex_type finish_mutex;
    boost::unique_lock<mutex_type> finish_lock(finish_mutex);

    unsigned const reader_count = 10;

    try
    {
        for(unsigned i = 0; i != reader_count; ++i)
        {
            pool.create_thread(
                test::locking_thread<boost::shared_lock<shared_mutex_type> >(
                    rw_mutex, unblocked_count,  unblocked_count_mutex,
                    unblocked_condition, finish_mutex,
                    simultaneous_running_count, max_simultaneous_running
                )
            );
        }

        hpx::this_thread::sleep_for(boost::chrono::seconds(1));

        pool.create_thread(
            test::locking_thread<boost::upgrade_lock<shared_mutex_type> >(
                rw_mutex, unblocked_count, unblocked_count_mutex,
                unblocked_condition, finish_mutex,
                simultaneous_running_count, max_simultaneous_running
            )
        );

        {
            boost::unique_lock<mutex_type> lk(unblocked_count_mutex);
            while(unblocked_count < (reader_count + 1))
            {
                unblocked_condition.wait(lk);
            }
        }

        CHECK_LOCKED_VALUE_EQUAL(unblocked_count_mutex,
            unblocked_count, reader_count + 1);

        finish_lock.unlock();
        pool.join_all();
    }
    catch(...)
    {
        pool.interrupt_all();
        pool.join_all();
        HPX_TEST(false);
    }

    CHECK_LOCKED_VALUE_EQUAL(unblocked_count_mutex,
        unblocked_count, reader_count + 1);
    CHECK_LOCKED_VALUE_EQUAL(unblocked_count_mutex,
        max_simultaneous_running, reader_count + 1);
}