0

次のmain.cがあります:

#include <unistd.h> //has thread calls for fork()
#include <stdio.h>

struct globalInfo{
    int x;
};

int do this()
{
    info.x++;
    printf("%d\n",info.x);
    return 0;
}
int main{
    struct globalInfo info = { .x = 2};
    for(int i = 0 ; i < 5 ; i++)
    {
         if(fork() = 0)
         {
             dothis();
         }
    }
 }

これは私の正確なコードではありませんが、私の質問はここでより簡単に示されています。

上記の関数の出力は次のようになります。

3
3
3
3
3

私が欲しいのは:

3
4
5
6
7

この構造体をスレッド間で共有するにはどうすればよいですか? すべてのスレッドが構造体の独自のコピーを作成し、独自のコピーを操作しているようです。へのパラメーターとして情報構造体へのポインターを渡そうとしましたが、dothis()それも修正されません。また、情報の初期化をメインの外に配置しようとしました。それもうまくいきませんでした..

助けていただければ幸いです。

4

3 に答える 3

0

anyIPCを使用して、データを b/w で共有しますprocesses。データ内はthreads次の方法で共有できます。

  • 渡されたスレッドの戻り値pthread_exitとキャッチpthread_join
  • shared/global resourcesynchronizingメソッドによってアクセスされるプロセスの
于 2013-05-16T09:07:42.190 に答える
0

人々がすでに指摘しているように、スレッドではなくプロセスを作成しています。プロセス間でデータを共有するのは困難です。すべてのプロセスには独自のメモリ アドレス空間があります。つまり、同じコードを共有できますが、データは非公開です。

プロセス間でデータを共有したい場合は、いくつかの手法があります。それらの1つは、メモリマップを使用した共有メモリです

#include <unistd.h> //has thread calls for fork()
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

struct globalInfo{
    int x;
};

char *shm = "/asd8"; // change this before every run to avoid error 22

int dothis()
{
    // sleep(1); // helps to simulate race condition
    int len = sizeof(struct globalInfo);

    int fd = shm_open(shm, O_RDWR, 0);
    void *addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (addr == MAP_FAILED){
        perror(""); // error handling
    }

    struct globalInfo *info = (struct globalInfo *)addr;
    info->x++;
    printf("%d %d\n", info->x, getpid());

    return 0;
}

int main(){
    struct globalInfo info = { .x = 2};
    int len = sizeof(struct globalInfo);

    int fd = shm_open(shm, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    if (fd == -1)
        perror(""); // error handling

    if(ftruncate(fd, len) == -1){
        printf("%d\n", errno); // osx produces error 22 don't know why
        perror("");
    }
    void *addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    memcpy(addr, &info, len);

    for(int i = 0 ; i < 5 ; i++)
    {
         if(fork() == 0)
         {
             dothis();
             break;
         }
    }
 }

サンプル出力

3 30588
4 30589
6 30590
6 30591
7 30592

また、 The Linux Programming Interface: A Linux and UNIX System Programming Handbook の章を読んでいただければ幸いです。

  • 24 プロセスの作成
  • 49 メモリマッピング
  • 53 個の POSIX セマフォ (データが共有された後に同期の問題を解決する必要があります)
  • 54 POSIX共有メモリ
于 2015-11-19T22:56:00.913 に答える