Пример #1
0
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 );
}
Пример #2
0
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;
    }
}