none
マルチスレッドプログラムのLinuxからの移植について

    質問

  • いつもお世話になっております。

    uraxです。

    LinuxからマルチスレッドのコードをWindowsに移植しようと考えています。
    Linuxでは、pthread(POSIX thread) を使って書かれているのですが、
    それをWindows(win32)に移植するのにどうしようかと考えています。
    一番ネックに思っているのが条件変数のcondやpthread_rwlockなどの
    処理です。

    pthread
    http://www.linux.or.jp/JM/html/LDP_man-pages/man7/pthreads.7.html

    移植する際には、問題になることが多いことだと思いますが、
    皆さんどのように対処されているのでしょうか。

    ノウハウなどありましたら、教えていただきたいと思っています。
    よろしくお願いします。
    2007年6月28日 6:24

すべての返信

  •  urax さんからの引用
    移植する際には、問題になることが多いことだと思いますが、
    皆さんどのように対処されているのでしょうか。

    ノウハウなどありましたら、教えていただきたいと思っています。
    よろしくお願いします。

     

    Windows 向けの再設計・再実装に関しては,Microsoft がマイグレーションガイドを出していますので,探して読んでみてください.

    コードの書き換えを最小限にするのであれば,(上のマイグレーションガイドでも紹介されていますが)『Windows Services for UNIX』を経由して POSIX サブシステムを利用したり,cygwin のような互換ミドルウェアを利用したりする方法が考えられます.(例えば cygwin がどのように POSIX Thread を移植しているか調べてみるのも役に立つのでは?)

     

    なお,私は POSIX Thread に関しては素人なのですが,man を見た感じでは cond については Windows Vista 移行に導入された条件変数で直接置き換えられそうに見えます.

    もちろんこれは Vista 以降でなければ使えませんので,それ以前の OS をターゲットに入れるのであれば,同等の仕組みを既存の同期プリミティブで再実装することになるかと思います.

     

    こんな感じで参考になりますでしょうか?

    2007年6月28日 7:56
  • pthreads-APIをWin32で実装したライブラリがあります。

    http://sourceware.org/pthreads-win32/

    使えるんじゃないでしょか。

     

    2007年6月28日 8:01
  • NyaRuRuさん、επιστημηさん

    貴重な情報ありがとうございます。
    さっそく使ってみようと思います。

    ありがとうございました。
    2007年6月28日 9:52
  • pthreads-APIをWin32を使ってみました。
    ばっちり動作しました。


    いろいろありがとうございました。
    2007年6月28日 15:04
  • 再度質問させてください。

    以下の関数もあわせて移植しようとしているのですが、
    timeoutの時間であるabstimeが、1970年1月1日0時0分0秒で指定する必要があります。
    int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

    Win32のAPIですと、現在の時間を取得するには、GetLocalTimeなどを使ってSYSTEMTIMEを取得する方法が一般的かと思います。

    この際、struct timespec型に変換するのは、みなさんどうされているのでしょうか?
    時間変換は思わぬトラブルが起こりそうなので、ノウハウがあるとしたら教えていただきたいと思っています。

    よろしくお願いします。

    2007年6月28日 15:19
  •  urax さんからの引用
    この際、struct timespec型に変換するのは、みなさんどうされているのでしょうか?
    時間変換は思わぬトラブルが起こりそうなので、ノウハウがあるとしたら教えていただきたいと思っています。

     

    How to recognize different types of timestamps from quite a long way away』で紹介されている,『How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME』の逆バージョンでいいのではないでしょうか?

    UNIX Time から Win32 FILETIME への変換は,私もこの方法を使っています.確かに暦に関する思わぬトラブルというのはあるのかもしれませんが,私にはノウハウがないので分かりません.

    2007年6月28日 17:42
  • NyaRuRuさん

     

    情報ありがとうございます。

    教えていただいた情報を元に実装してみます。

    ありがとうございました。

    2007年6月29日 2:36