3

これが私のコードです:

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

static volatile int t=0;

int main(void){
    int i;
    for (i=0; i<2; i++){
        fork();
        printf("pid:%d: addr:%d val:%d\n", getpid(), &t, t++);
    }
    printf("pid:%d: addr:%d val:%d\n", getpid(), &t, t++);
    return 0;
}

そのような出力:

pid:16232: addr:134518684 val:0
pid:16233: addr:134518684 val:0
pid:16232: addr:134518684 val:1
pid:16232: addr:134518684 val:2
pid:16234: addr:134518684 val:1
pid:16234: addr:134518684 val:2
pid:16233: addr:134518684 val:1
pid:16233: addr:134518684 val:2
pid:16235: addr:134518684 val:1
pid:16235: addr:134518684 val:2

グローバル変数tのアドレスは同じですが、すべてのスレッドが同じ変数tを操作していますか?valは「0、1、2、3、4、5、...」だったと思いますが、どうすればよいですか?

4

3 に答える 3

4

これは別のプロセスをフォークするものであり、新しいスレッドを生成するものではありません。フォークされたプロセスは親プロセスメモリのコピーを取得するため、結果は理にかなっています。

フォークを使用する場合は、これがより標準的な方法です。

int main ()
{
   int pid;

   pid = fork();

   if (pid == 0) {
      // This will be where the child process executes
   } else if (pid > 0) {
     // This is where the parent process executes
   }
   return 0;
}
于 2012-09-13T10:12:31.243 に答える
3

結果は正しいです。これは、フォークするときに、親プロセスメモリのコピーを取得する新しいプロセスを作成するためです。

表示されるアドレスは仮想であるため、同じであっても、同じ物理メモリゾーンを指しているわけではありません。

于 2012-09-13T10:18:09.253 に答える
3

fork他の人が述べた理由により、あなたが期待する結果を生み出すことはありません。新しいスレッドが生成されたとしても、スレッドセーフな方法で変数をインクリメントしているわけではありません。スレッドを生成し、各スレッドで変数をインクリメントする場合は、次のようにpthreadとミューテックスを使用できます。

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

int t = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* threadFunc(void* param) {
    pthread_mutex_lock(&mutex);
    printf("%d\n", t++);
    pthread_mutex_unlock(&mutex);
}

int main(void){
    int i;
    pthread_t threads[5];
    for (i = 0; i < 5; i++){
        pthread_create(&threads[i], NULL, threadFunc, NULL);
    }

    for (i = 0; i < 5; i++){
        pthread_join(threads[i], NULL);
    }

    pthrad_mutex_destroy(&mutex);
    return 0;
}

すべてのスレッドは親プロセス(が配置されtている場所)のアドレス空間を共有するため、すべて同じようにインクリメントされますt

于 2012-09-13T10:26:45.657 に答える