void versionLockSync() {
	std::thread tWriter(lock_writer);
	std::thread tReader(lock_reader);
	std::this_thread::sleep_for(std::chrono::seconds(4));
		
	finish_reader = true;
	finish_writer = true;
	tReader.join();
	tWriter.join();
}
void versionMultipleLockSync() {
	std::thread tReader(multiple_lock_reader,1);
	std::thread tReader2(multiple_lock_reader,2);
	std::thread tReader3(multiple_lock_reader,3);
	std::thread tWriter(multiple_lock_writer);
	std::this_thread::sleep_for(std::chrono::seconds(4));
		
	finish_reader = true;
	finish_writer = true;
	tReader.join();
	tReader2.join();
	tReader3.join();
	tWriter.join();
}
Ejemplo n.º 3
0
TEST(PumpTest, QueueRandomSleep) {
	std::atomic_int queue_size(0);
	const int messages_limit(21);
	const int concurrency_limit(5);

	std::atomic_int received_messages;
	std::atomic_int sent_messages;

	std::mutex mutex;
	std::condition_variable condition;

	ioremap::grape::concurrent_pump pump;
	pump.concurrency_limit = concurrency_limit;

	auto reader = [&] {
		received_messages = 0;
		while (true) {
			std::unique_lock<std::mutex> lock(mutex);
			if (received_messages >= messages_limit && queue_size == 0) {
				break;
			}
			if (queue_size == 0) {
				continue;
			}

			// read message
			++received_messages;
			--queue_size;
			pump.complete_request();
			lock.unlock();

			std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 50));
		}
	};

	sent_messages = 0;
	auto writer = [&] {
		std::unique_lock<std::mutex> lock(mutex);
		if (sent_messages >= messages_limit) {
			pump.stop();
			pump.complete_request();
			return;
		}
		assert(queue_size < concurrency_limit);

		// write message
		++sent_messages;
		++queue_size;
		lock.unlock();

		std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 50));
	};

	std::thread tReader(reader);

	pump.run(writer);

	tReader.join();

	EXPECT_EQ(sent_messages, messages_limit);
	EXPECT_EQ(received_messages, messages_limit);
}