0

shm_open、ftruncate、およびmmapを使用して、動的に作成された2次元配列を共有メモリに格納しています。配列を更新すると、その更新はその更新を行ったプロセスでのみ表示され、その共有メモリマッピングを使用している他のプロセスは表示されません。さらに苦労することなく-コード(関連ビット):

int fd;
int** graph;
fd = shm_open("/graph", O_RDWR|O_CREAT, 0666);
ftruncate(fd, sizeof(int)*numVertices*numVertices);
graph = (int**) mmap(NULL, sizeof(int)*numVertices*numVertices, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
foo(numVertices, fd);

/* Down to function definition */
void foo(int numVertices, int fd) {
    int i=0;
    for (i; i<num_processes; i++) {
        int pid = fork();
        if (pid == 0) {
            int **graph = (int**) mmap(NULL, sizeof(int)*numVertices*numVertices, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
            graph_algorithm(i, numVertices, graph);
        }
    } 
}

void graph_algorithm(int proc_num, int numVertices, int** graph) {
     pthread_mutex_lock(&mutex);
     if (proc_num == 0) {
          graph[0][0] = 1;
     }
     pthread_mutex_unlock(&mutex);

     printf("Process %d: %d\n", proc_num, graph[0][0]);
}

印刷がgraph_algorithmで行われる場合、proc_num0のプロセスはgraph[0] [0]で1になりますが、他のすべてのプロセスは古い値0を維持します。フォークとmmapのエラーチェックを省略しましたが、これが要点です。問題の。また、graph [0] [0] = 1の後でmsync(graph、sizeof(int)* numVertices * numVertices、MS_SYNC)を呼び出してみましたが、役に立ちませんでした。共有メモリを使用するのはこれが初めてで、何が間違っているのかわかりません。この問題は、私が見た限りでは、ここや他のサイトでは発生していません。どんな助けでも大歓迎です。

4

2 に答える 2

3

graph_algorithm()特に、の寸法を指定していない場合は、ダブルポインタを使用していることが問題だと思いますgraph。このコンテキストでgraph[0][0]は、はと同等になり*(*graph)ます。これは、マップされたメモリを指している場合とそうでない場合があります。配列がマップされたメモリの単一の連続した領域を指していることを確認する必要があります。少なくとも1つの次元を知っている限り、2次元配列を取得できます。したがって、代わりにgraph[x][y]を使用しますgraph[x * numVertices + y]。コンパイラによっては、引き続きdouble配列を使用できる場合がありますが、の次元の1つを明示的に指定する必要がありますgraph。したがって、のプロトタイプは次のgraph_algorithmようになります

void graph_algorithm(int proc_num, int numVertices, int graph[][numVertices])
于 2013-02-19T05:23:24.687 に答える
1

ミューテックスに明らかに問題があります。ミューテックスがプロセス間で共有されていない限り、プロセス間の同時アクセスが妨げられることはありません。私はそれの定義や初期化さえ見ていません。

レースもあります。ミューテックスが共有されている場合でも、他のプロセスのprintfは、プロセス0の前に実行されることが保証されていません。

結果にアクセスする前に、グラフアルゴリズムの最後で同期する方法を用意して、すべてが終了していることを確認する必要があります。

プロセスがすべて寸法に同意している限り、2D配列に問題はありません。

于 2016-06-15T19:47:50.487 に答える