int __CBeginThread( thread_fn *start_addr, int prio, const char *thread_name, unsigned stack_size, void *arglist ) /************************************************************/ { thread_args *td; int th; int wait_handle; if( __TlsIndex == NO_INDEX ) { if( !__RdosThreadInit() ) return( -1L ); __InitMultipleThread(); } td = malloc( sizeof( *td ) ); if( td == NULL ) { _RWD_errno = ENOMEM; return( -1L ); } stack_size = __ROUND_UP_SIZE_4K( stack_size ); wait_handle = RdosCreateWait(); td->rtn = start_addr; td->argument = arglist; td->signal = RdosCreateSignal(); RdosResetSignal( td->signal ); RdosAddWaitForSignal( wait_handle, td->signal, 0 ); __create_thread(begin_thread_helper, prio, thread_name, td, stack_size); RdosWaitForever( wait_handle ); RdosFreeSignal( td->signal ); RdosCloseWait( wait_handle ); th = td->tid; free( td ); return( th ); }
void MSocketRequest::send() { std::lock_guard<decltype(g_mutex)> guard(g_mutex); static bool threadInitialized = false; if (!threadInitialized) { threadInitialized = true; __create_thread(g_requests_low, g_num_of_threads_low, 0 ,1); __create_thread(g_requests_normal, g_num_of_threads_normal, 0, 2); __create_thread(g_requests_high, g_num_of_threads_high, 0, 3); // monitor thread std::thread([](){ while (1) { __create_thread(g_requests_low, g_num_of_threads_low, 2, g_requests_low.size()); __create_thread(g_requests_normal, g_num_of_threads_normal, 10, g_requests_normal.size()); __create_thread(g_requests_high, g_num_of_threads_high, 20, g_requests_high.size()); std::this_thread::sleep_for(std::chrono::seconds(3)); } }).detach(); } _startTime = time(NULL); switch (_priority) { case LOW: g_requests_low.push(this); break; case NORMAL: g_requests_normal.push(this); break; case HIGH: g_requests_high.push(this); break; default: break; } }