2017-06-23 58 views
1

我有一個用線程創建線程的頭文件(C11)。現在我想創建另一個可以選擇用於Windows操作系統(WIN32)的頭文件。我目前正在努力開始,主要是因爲它需要保持函數簽名,我不明白如何處理這個問題。這裏是我的問題:爲窗口實現C11線程

C11頭片段:

/* types */ 
typedef pthread_t thrd_t; 
typedef pthread_mutex_t mtx_t; 
typedef pthread_cond_t cnd_t; 
typedef pthread_key_t tss_t; 
typedef pthread_once_t once_flag; 

typedef int (*thrd_start_t)(void*); 
typedef void (*tss_dtor_t)(void*); 

static inline int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) 
{ 
    return pthread_create(thr, 0, (void*(*)(void*))func, arg) == 0 ? thrd_success : thrd_error; 
} 

WIN32(我至今):

/* types */ 
typedef HANDLE thrd_t; 

static inline int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) 
{ 
    thrd_t = CreateThread(
      _In_  SIZE_T     dwStackSize, 
      _In_  LPTHREAD_START_ROUTINE lpStartAddress, 
      _In_  DWORD     dwCreationFlags, 
     ); 
    return pthread_create(thr, 0, (void*(*)(void*))func, arg) == 0 ? thrd_success : thrd_error; 
} 

我特意粘貼的CreateThread的簽名()來解釋我的問題:現在如何使用我的輸入(thrd_t *thr, thrd_start_t func, void *arg)代替CreateThread()?我的意思是,我也沒有StackSize,也沒有任何CreationFlags。

我想我在某個地方會出錯,但我不知道在哪裏。如果我設法理解這篇文章,我可以自己完成標題的其餘部分。我知道那裏有解決方案,但我想理解這一點。

+1

*爲什麼*你想在Windows API上實現自己的* pthreads *?這已經完成了(但可能比只是一個標題更多的工作),並且可以很好地工作,例如,在我的* MinGW *安裝。對於C11線程,你可以[使用這個頭文件](https://github.com/jtsiomb/c11threads/blob/master/c11threads.h)* pthreads *可用。 –

+0

好的,我解釋得很糟糕:我不想在windows上實現pthreads。我想在窗口上使用C11線程,並用windows掛件替換pthreads。 – PKlumpp

+0

您可能會在[現有實現](https://locklessinc.com/downloads/winpthreads.h)中找到一些靈感。 'Stacksize 0'代表使用[這裏]解釋的默認值(https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v = vs.85).aspx)。 –

回答

-1

如果可能,您應該使用Standard Thread Library

+0

這應該是一個註釋 –

+2

這個特定於C++的庫在C特定的問題中是如何相關的? – AnT

+0

提供了錯誤的鏈接。現在已經糾正了。 – cse