Browse Source

多线程里使用channel测试通关

tags/v2.9.7
tearshark 4 years ago
parent
commit
469d583cad
2 changed files with 18 additions and 12 deletions
  1. 16
    10
      tutorial/test_async_channel_mult_thread.cpp
  2. 2
    2
      vs_proj/librf.cpp

+ 16
- 10
tutorial/test_async_channel_mult_thread.cpp View File

static std::mutex cout_mutex; static std::mutex cout_mutex;
std::atomic<intptr_t> gcounter = 0; std::atomic<intptr_t> gcounter = 0;
#define OUTPUT_DEBUG 1
#define OUTPUT_DEBUG 0
future_t<> test_channel_consumer(const channel_t<std::string> & c, size_t cnt) future_t<> test_channel_consumer(const channel_t<std::string> & c, size_t cnt)
{ {
} }
} }
const size_t N = 8;
const size_t BATCH = 1000000;
const size_t MAX_CHANNEL_QUEUE = N + 1; //0, 1, 5, 10, -1
const size_t THREAD = 12;
const size_t BATCH = 10000;
const size_t MAX_CHANNEL_QUEUE = THREAD + 1; //0, 1, 5, 10, -1
void resumable_main_channel_mult_thread() void resumable_main_channel_mult_thread()
{ {
std::thread write_th([&] std::thread write_th([&]
{ {
local_scheduler my_scheduler; //2017/12/14日,仍然存在BUG。真多线程下调度,存在有协程无法被调度完成的BUG local_scheduler my_scheduler; //2017/12/14日,仍然存在BUG。真多线程下调度,存在有协程无法被调度完成的BUG
go test_channel_producer(c, BATCH * N);
go test_channel_producer(c, BATCH * THREAD);
#if RESUMEF_ENABLE_MULT_SCHEDULER #if RESUMEF_ENABLE_MULT_SCHEDULER
this_scheduler()->run_until_notask(); this_scheduler()->run_until_notask();
#endif #endif
std::cout << "Write OK\r\n";
{
scoped_lock<std::mutex> __lock(cout_mutex);
std::cout << "Write OK\r\n";
}
}); });
//std::this_thread::sleep_for(100ms);
std::this_thread::sleep_for(100ms);
std::thread read_th[N];
for (size_t i = 0; i < N; ++i)
std::thread read_th[THREAD];
for (size_t i = 0; i < THREAD; ++i)
{ {
read_th[i] = std::thread([&] read_th[i] = std::thread([&]
{ {
#if RESUMEF_ENABLE_MULT_SCHEDULER #if RESUMEF_ENABLE_MULT_SCHEDULER
this_scheduler()->run_until_notask(); this_scheduler()->run_until_notask();
#endif #endif
std::cout << "Read OK\r\n";
{
scoped_lock<std::mutex> __lock(cout_mutex);
std::cout << "Read OK\r\n";
}
}); });
} }

+ 2
- 2
vs_proj/librf.cpp View File

{ {
(void)argc; (void)argc;
(void)argv; (void)argv;
resumable_main_layout();
benchmark_main_channel_passing_next();
//if (argc > 1) //if (argc > 1)
// resumable_main_benchmark_asio_client(atoi(argv[1])); // resumable_main_benchmark_asio_client(atoi(argv[1]));
//resumable_main_event(); //resumable_main_event();
//resumable_main_event_timeout(); //resumable_main_event_timeout();
//resumable_main_channel(); //resumable_main_channel();
//resumable_main_channel_mult_thread(); //测试失败!
//resumable_main_channel_mult_thread();
//resumable_main_sleep(); //resumable_main_sleep();
//resumable_main_when_all(); //resumable_main_when_all();
//benchmark_main_channel_passing_next(); //benchmark_main_channel_passing_next();

Loading…
Cancel
Save