0

非常に単純なクロスプラットフォーム(linux / windows)スレッド関数を作成する方法を知っています。これは私のサンプルコードです:

#if LINUX
 #include <pthread.h>
 ThreadHandle createThread(???* callback, void* data) {   //I dont know what is data type of function pointer, sorry
     pthread_t handle;
     pthread_create(&handle, 0, callback, (void*)data);
     return (ThreadHandle)handle;
 }
 define_data_type ThreadHandle = pthread_t;  //I don't know how this is done at all, sorry
#endif
#if WINDOWS
  #include <windows.h>
  ThreadHandle createThread(???* callback, void* data) {
        HANDLE handle = CreateThread( 
        NULL,                   // default security attributes
        0,                      // use default stack size  
        callback,               // thread function name
        data,                   // argument to thread function 
        0,                      // use default creation flags 
        NULL);   // returns the thread identifier - I don't need this, do I?
  }
  define_data_type ThreadHandle = HANDLE;  //I don't know how this is done at all, sorry
#endif

これは最初は奇妙な質問のように見えるのではないかと思いますが、私は初心者であり、C++を理解する必要があることを忘れないでください。「わからない」というコメントを残した部分は、お気軽に編集してください。 これが間違った質問だと思われる場合は、私がどのように質問すべきかについてコメントを残してください。

4

1 に答える 1

1
  1. すべてのスレッド関数を抽象化するThread.hのようなプラットフォームに依存しないヘッダーを持つことから始めます
  2. *。$platform.cppファイルにプラットフォーム固有のコードを含める
  3. 明らかに、ビルドシステムはプラットフォーム関連のコードのみをコンパイルする必要があります

さて、特定のコードについて

このようなものを使用してジェネリック型を定義します

typedef unsigned long os_error_t;

typedef void * os_console_handle;
typedef void * os_thread_handle;
typedef void * os_event_handle;
typedef unsigned long os_pid_t;
typedef unsigned long os_thread_id;

Linuxでは、pthread_create(..)を使用して呼び出します。Windowsでは、CreateThread(..)を使用して呼び出します。特定の実装については、ドキュメントをお読みください。

コールバックには、次のようなものを使用できます

typedef os_error_t (*thread_start_function_t)(void *);

class InternalThreadArgs {
    thread_start_function_t m_func;
    void *m_pArg;
public:
    InternalThreadArgs(thread_start_function_t pf, void *pArg) {
        m_func = pf;
        m_pArg = pArg;
    }
    os_error_t Run() {
        return m_func(m_pArg);
    }
};

今、あなたの抽象的なメソッドシグネチャを次のようにします

     os_error_t create_thread(thread_start_function_t pf, void *pArg, os_thread_handle *pHandle);
于 2013-03-05T01:29:04.397 に答える