トップ «前の日(06-01) 最新 次の日(06-03)» 追記

SewiGの日記

2004|01|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|

2005-06-02 [木]

[Video] 劇場版 電車男

先行試写会で見た人がいたので、感想を聞くと

「(話に)深みはなかったけど、こういう話もあるんだね。」

だそうです。ちなみにこの人は原作(2ちゃんねるの過去ログや書籍版)は読んでなく、2ちゃんねるにも行ったことが無いとのこと。ところどころ2ちゃんねる用語が出てくるらしいのですがその辺は理解できたのでしょうか。ネットに触れない人でも分かるように、さらに原作の雰囲気が伝わるように作りこんでるのだなぁ。一般公開されて評判が良かったら見よう。

それにしても最近はネット発が増えましたね。特に書籍。


2006-06-02 [金]

[Programming] pthread

以前、Win32でCreateThreadを使うときは注意しようなんてことを書いたので、今度はUnixのスレッドについて書いてみます。幸い、pthread.hにPOSIXなスレッドが用意されているのでこれを使いましょう。

pthread_create()でスレッドを作成します。このとき引数に作成されたスレッドが処理する関数を渡しておきます。あるスレッドの同期を取りたければ、pthread_join()で処理を待ちます。そしてコンパイルするときは、マルチスレッドなコードであることをコンパイラに教えます。

cc -D_REENTRANT -o thread thread.c -lpthread

これは、マルチスレッドだと動かない処理が含まれると困るからです。再入可能か否か。

例えば以下のような感じでマルチスレッドなコードが書けます。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

int counter = 0;

void *increment() {
        int i;

        for (i = 0; i < 10000000; i++) {
                counter++;
        }
}

int main(void) {
        pthread_t tid1, tid2;

        pthread_create(&tid1, NULL, increment, NULL);
        pthread_create(&tid2, NULL, increment, NULL);

        pthread_join(tid1, NULL);
        pthread_join(tid2, NULL);
        printf("%d\n", counter);
}

しかし、上記のコードは正常に動作しません。2つのスレッド間で同期が取れていないからです。片方のスレッドで変数を参照して、スレッドが切り替わってもう一方のスレッドが変数を参照してから値をインクリメントして演算結果を変数に書き戻す。そしてスレッドが切り替わって先ほどのスレッドが変数を更新したら、一方の更新が無くなりますよね。lost updateです。

そこでセマフォを利用します。変数をあるスレッドが変数にアクセスしているときはロックしてブロックします。具体的には以下のようにします。

struct {
       pthread_mutex_t mutex;
       int value;
} counter = {PTHREAD_MUTEX_INITIALIZER, 0};

pthread_key_t private_key;

void *increment() {
       int i;
       int *privp;

       pthread_setspecific(private_key, malloc(sizeof(int)));
       privp = pthread_getspecific(private_key);
       *privp = 0;

       for (i = 0; i < 10000000; i++) {
               pthread_mutex_lock(&counter.mutex);
               counter.value++;
               pthread_mutex_unlock(&counter.mutex);

               privp = pthread_getspecific(private_key);
               (*privp)++;
       }

       printf("%d\n", *privp);
}

int main(void) {
       pthread_t tid1, tid2;

       pthread_key_create(&private_key, NULL);

       pthread_create(&tid1, NULL, increment, NULL);
       pthread_create(&tid2, NULL, increment, NULL);

       pthread_join(tid1, NULL);
       pthread_join(tid2, NULL);
       printf("%d\n", counter.value);
}

private_keyはセマフォとは直接関係ありませんが一応。


2007-06-02 [土]

[Flash] そして恥ずかしげもなく

昔作ったゲームをFlash Lite2に移植したものを公開してみる。http://sewig.jp/diary/archive/mc2007/index.html


Copyright © 2004-2008 SewiG All rights reserved.