2011-04-21 63 views
2

ansi c99中的主題。我正在尋找快速的東西,並且是跨平臺的(或者至少是win/mac/linux)。我在這裏有什麼選擇?c線程;快速和便攜?

  • pthreads-32不再活躍(2006年的最新更新)。

  • 我正在使用MinGW作爲編譯器,所以正常的pthreads可能工作?

  • 升壓是好的,但只有C++

  • protothreads看好? http://www.sics.se/~adam/pt/

  • OpenMP需要編譯器支持,並且對我的需求來說似乎很大。

  • 我正在使用OpenCL;但對於CPU上的「簡單線程」使用似乎很尷尬,並且不支持所有內容(也就是說,製作線程播放音樂確實很困難/不可能)。

回答

4

首先,您使用的是OpenCL,爲什麼OpenMP會「爲您的需要大」?編譯器支持不是問題。我相信沒有編譯器支持/「與OpenCL協同工作」,而OpenCL不支持OpenMP。

其次,pthreads-win32可能看起來很舊,但它並不是多餘的或「壞」的,因爲它。很多項目仍然使用該庫成功。

我會去這個列表(按優先順序排列):

  1. 的OpenMP(簡單,可移植性)
  2. 並行線程(便攜)
  3. C++ 2011線又名Boost.Thread(但是C++,而不是C)
  4. pthreads在Windows上的POSIX,Win32線程。

順便說一句,OpenCL不使用完全獨立的小程序的內核,這些程序根據硬件具有自己的並行執行,無論您如何在內核之外應用線程。

+0

是;這就是說它不適合說音頻線程的原因。 - Pthreads-w32(不是pthreads)沒有乾淨地構建,並且有很多優秀/已知問題/ bug,開發人員在過去的5年以上拒絕維護它。普通的pthreads甚至可以在win32/x64上工作嗎? OpenMP是一個選項,但谷歌的「openmp cpu usage」 - 已知問題噸,再加上它不是真正意義上的「後臺」線程(如音頻或內務)。 OpenMP不是任何方式的「輕量級」線程模型。 – user697111 2011-04-22 06:53:02

+0

然後你唯一的選擇將是本地線程(也許很好地由Boost.thread包裝)。沒有辦法,如果你需要精確的控制和速度。 – rubenvb 2011-04-22 09:57:41

1

這裏是一個跨平臺的方式爲提供並行線程功能的標題:

// ================================================================================================================= 
// xs_CThread.h - copyright Sree Kotay 2006-2013 
// ================================================================================================================= 
#ifndef _xs_CTHREAD_H_ 
#define _xs_CTHREAD_H_ 

// ================================================================================================================= 
// basic emuation 
// ================================================================================================================= 
#if _MSC_VER>=1200 
    #include <windows.h> 
    #include <process.h> 
    #define XS_THREAD_CALL   __stdcall 
    typedef HANDLE     pthread_mutex_t; 
    typedef HANDLE     xs_threadhandle; 
    typedef unsigned int   (XS_THREAD_CALL *xs_ThreadProc)(void *); 
    #define XS_THREAD_RETURN  unsigned int 

    #define XS_TLS     _declspec(thread) 
    #define XS_runthread(th, p, d) th=(HANDLE)_beginthread(p, 0, d) 
    #define XS_endthread(th)  TerminateThread((HANDLE)th, 0) 
#elif __GNUC__>3 || (__GNUC__==3 && __GNUC_MINOR__>3) 
    #include <pthread.h> 
    #define XS_THREAD_CALL   
    typedef pthread_t    xs_threadhandle; 
    typedef void     *(*xs_ThreadProc)(void *); 
    #define XS_THREAD_RETURN  void* 

    #define XS_TLS     __thread 
    #define XS_runthread(th,p,d) pthread_create(&th, NULL, p, d) 
    #define XS_endthread(th)  pthread_cancel(th) 
#else 
    ////uh..... out'o'luck you are.... 
#endif 

// ================================================================================================================= 
// Windows emuation of pthread library 
// from mongoose webserver -- http://code.google.com/p/mongoose/ 
// 
// Copyright (c) 2004-2013 Sergey Lyubka 
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy 
// of this software and associated documentation files (the "Software"), to deal 
// in the Software without restriction, including without limitation the rights 
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
// copies of the Software, and to permit persons to whom the Software is 
// furnished to do so, subject to the following conditions: 
// 
// The above copyright notice and this permission notice shall be included in 
// all copies or substantial portions of the Software. 
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
// THE SOFTWARE. 
// ================================================================================================================= 
#if defined(_WIN32) && !defined(__SYMBIAN32__) && !defined(_MONGOOSE_WEBSERVER_) 
typedef struct {HANDLE signal, broadcast;} pthread_cond_t; 

static int pthread_mutex_init(pthread_mutex_t *mutex, void *unused) { 
    unused = NULL; 
    *mutex = CreateMutex(NULL, FALSE, NULL); 
    return *mutex == NULL ? -1 : 0; 
} 

static int pthread_mutex_destroy(pthread_mutex_t *mutex) { 
    return CloseHandle(*mutex) == 0 ? -1 : 0; 
} 

static int pthread_mutex_lock(pthread_mutex_t *mutex) { 
    return WaitForSingleObject(*mutex, INFINITE) == WAIT_OBJECT_0? 0 : -1; 
} 

static int pthread_mutex_unlock(pthread_mutex_t *mutex) { 
    return ReleaseMutex(*mutex) == 0 ? -1 : 0; 
} 

static int pthread_cond_init(pthread_cond_t *cv, const void *unused) { 
    unused = NULL; 
    cv->signal = CreateEvent(NULL, FALSE, FALSE, NULL); 
    cv->broadcast = CreateEvent(NULL, TRUE, FALSE, NULL); 
    return cv->signal != NULL && cv->broadcast != NULL ? 0 : -1; 
} 

static int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex) { 
    HANDLE handles[] = {cv->signal, cv->broadcast}; 
    ReleaseMutex(*mutex); 
    WaitForMultipleObjects(2, handles, FALSE, INFINITE); 
    return WaitForSingleObject(*mutex, INFINITE) == WAIT_OBJECT_0? 0 : -1; 
} 

static int pthread_cond_signal(pthread_cond_t *cv) { 
    return SetEvent(cv->signal) == 0 ? -1 : 0; 
} 

static int pthread_cond_broadcast(pthread_cond_t *cv) { 
    return PulseEvent(cv->broadcast) == 0 ? -1 : 0; 
} 
#else 
static int pthread_mutex_init(pthread_mutex_t *mutex, void *unused); 
static int pthread_mutex_destroy(pthread_mutex_t *mutex); 
static int pthread_mutex_lock(pthread_mutex_t *mutex); 
static int pthread_mutex_unlock(pthread_mutex_t *mutex); 
static int pthread_cond_init(pthread_cond_t *cv, const void *unused); 
static int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex); 
static int pthread_cond_signal(pthread_cond_t *cv); 
static int pthread_cond_broadcast(pthread_cond_t *cv); 
#endif //pthread emulation 




#endif // for entire file 
您的OpenCL問題