thread_win32.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 171 行
C
171 行
/*************************************************************************** begin : Wed Dec 14 2005 copyright : (C) 2005 by Caglar Oral email : caglaroral@yahoo.com ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 2.1 of the * * License, or (at your option) any later version. * * * ***************************************************************************/#include <windows.h>struct s_thread_sem_s { HANDLE sem_id;};#include "thread_mutex_emul.c"static int s_thread_win32_sem_create (s_thread_sem_t *sem, int initial){ if (sem == NULL) { goto err; } sem->sem_id = CreateSemaphore(NULL, initial, 32 * 1024, NULL); if (sem->sem_id == NULL) { goto err; } return 0;err: return -1;}static int s_thread_win32_sem_destroy (s_thread_sem_t *sem){ if ((sem == NULL) || (sem->sem_id < 0)) { goto err; } CloseHandle(sem->sem_id); sem->sem_id = 0; return 0;err: return -1;}static int s_thread_win32_sem_wait_timeout (s_thread_sem_t *sem, int msec){ int ret; DWORD dwMilliseconds; if ((sem == NULL) || (sem->sem_id < 0)) { return -1; } if (msec == (~(int) 0)) { dwMilliseconds = INFINITE; } else { dwMilliseconds = (DWORD) msec; } ret = WaitForSingleObject(sem->sem_id, dwMilliseconds); switch (ret) { case WAIT_OBJECT_0: return 0; case WAIT_TIMEOUT: return 1; default: return -1; }}static int s_thread_win32_sem_wait (s_thread_sem_t *sem){ int ret; if ((sem == NULL) || (sem->sem_id < 0)) { goto err; } ret = s_thread_win32_sem_wait_timeout(sem, INFINITE); if (ret < 0) { goto err; } return 0;err: return -1;}static int s_thread_win32_sem_post (s_thread_sem_t *sem){ if ((sem == NULL) || (sem->sem_id < 0)) { goto err; } if (ReleaseSemaphore(sem->sem_id, 1, NULL) == FALSE) { goto err; } return 0;err: return -1;}struct s_thread_s { HANDLE tid;};static DWORD WINAPI ThreadEntry (LPVOID argp){ s_thread_run(argp); return 0;}static int s_thread_win32_thread_create (s_thread_t *tid, void * (*f) (void *), void *farg){ DWORD threadnum; tid->tid = CreateThread(NULL, 0, ThreadEntry, farg, 0, &threadnum); if (tid->tid == NULL) { goto err; } return 0;err: return -1;}static int s_thread_win32_thread_cancel (s_thread_t *tid){ return -1;}static int s_thread_win32_thread_join (s_thread_t *tid, void **ret){ WaitForSingleObject(tid->tid, INFINITE); CloseHandle(tid->tid); return 0;}static int s_thread_win32_thread_self (void){ return (GetCurrentThreadId());}static void s_thread_win32_thread_exit (void *ret){ ExitThread(0);}static s_thread_api_t s_thread_win32 = { s_thread_win32_sem_create, s_thread_win32_sem_destroy, s_thread_win32_sem_wait, s_thread_win32_sem_wait_timeout, s_thread_win32_sem_post, s_thread_emul_mutex_init, s_thread_emul_mutex_destroy, s_thread_emul_mutex_lock, s_thread_emul_mutex_trylock, s_thread_emul_mutex_unlock, s_thread_emul_cond_init, s_thread_emul_cond_destroy, s_thread_emul_cond_signal, s_thread_emul_cond_broadcast, s_thread_emul_cond_wait, s_thread_emul_cond_timedwait, s_thread_win32_thread_create, s_thread_win32_thread_cancel, s_thread_win32_thread_join, s_thread_win32_thread_self, s_thread_win32_thread_exit,};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?