- /**
- * @file kc_windows_thread.h
- * @brief Windows 用スレッドモジュールヘッダファイル
- * @copyright 2020 - 2024 Nomura Kei
- * @depends
- * kc.h
- */
- #ifndef KC_WINDOWS_THREAD_H
- #define KC_WINDOWS_THREAD_H
-
- #include <kc.h>
- #if (KC_IS_WINDOWS)
- #include <process.h>
-
- #ifdef __cplusplus
- extern "C"
- {
- namespace kc
- {
- using namespace std;
- #endif
-
- #define thread_local _Thread_local
-
- ////////////////////////////////////////////////////////////////////////
- //
- // Thread
- //
-
- enum
- {
- thrd_success = 0, //!< 成功
- thrd_bussy = 1, //!< busy
- thrd_error = 2, //!< エラー発生
- thrd_nomem = 3, //!< メモリ不足
- thrd_timedout = 4 //!< タイムアウト発生
- };
-
- typedef struct
- {
- HANDLE handle;
- DWORD thread_id;
- } thrd_t;
-
- typedef int (*thrd_start_t)(void *);
- int thrd_create(thrd_t *thr, thrd_start_t func, void *arg);
- int thrd_join(thrd_t thr, int *res);
- int thrd_detach(thrd_t thr);
- thrd_t thrd_current(void);
- int thrd_equal(thrd_t lhs, thrd_t rhs);
- int thrd_sleep(const struct timespec *duration, struct timespec *remaining);
-
- ////////////////////////////////////////////////////////////////////////
- //
- // mutex
- //
-
- enum
- {
- mtx_plain = 0, //!< 通常
- mtx_recursive = 1, //!< 再帰
- mtx_timed = 2 //!< timed
- };
-
- typedef struct
- {
- CRITICAL_SECTION cs;
- int type;
- } mtx_t;
-
- int mtx_init(mtx_t *mtx, int type);
- void mtx_destroy(mtx_t *mtx);
- int mtx_lock(mtx_t *mtx);
- int mtx_unlock(mtx_t *mtx);
-
- ////////////////////////////////////////////////////////////////////////
- //
- // cond
- //
-
- typedef struct
- {
- CONDITION_VARIABLE cond;
- } cnd_t;
-
- int cnd_init(cnd_t *cond);
- int cnd_signal(cnd_t *cond);
- int cnd_broadcast(cnd_t *cond);
- int cnd_wait(cnd_t *cond, mtx_t *mtx);
- int cnd_timedwait(cnd_t *cond, mtx_t *mtx, const struct timespec *ts);
- void cnd_destroy(cnd_t *cond);
-
- #endif // (KC_IS_WINDOWS)
- #ifdef __cplusplus
- } // namespace kc
- } // extern "C"
- #endif
- #endif // KC_SOCKET_H