2016-09-18 91 views
0

這裏的問題是,我想我們的投票是93. 我希望變量被所有線程共享。就像一個靜態變量對所有對象都是通用的,我想要一個變量對所有線程都通用。如何使用Mmap共享內存。請糾正我的代碼

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/mman.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 

static int *glob_var; 

int main(void) 
    { 
    glob_var = (int*)mmap(NULL, sizeof *glob_var, PROT_READ | PROT_WRITE, 
       MAP_SHARED | MAP_ANONYMOUS, -1, 0); 

    *glob_var = 1; 
    int ppid =fork(); 

    if (ppid == 0) { 
    *glob_var = 92; printf("%d\n", *glob_var); 

    } else if(ppid!=0){ 
    (*glob_var)++; /////I want a 93 over here??? 
     printf("%d\n", *glob_var); /////I want a 93 over here??? print 
     munmap(glob_var, sizeof *glob_var); 
    } 
    return 0; 
    } 
+0

變量所有線程之間共享。你不必做任何事情來實現這一點。 – xaxxon

+0

這就是線程和進程之間的區別。每個進程都有自己的內存,線程都運行在同一個內存中。只需使用全局變量或在線程之間傳遞指針即可。 – Barmar

回答

0

兩個進程更新glob_var。您需要協調對此共享內存的訪問。必須保證數據修改的正確順序,即應首先分配值92

Semaphore經常被用來在這樣的情況下同步操作:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/mman.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 
#include <unistd.h> 

// Binary semaphore implementation. Initial state 0 
union semun 
{ 
    int val; 
    struct semid_ds *buf; 
    unsigned short int *array; 
    struct seminfo *__buf; 
}; 

int binary_semaphore_allocation (key_t key, int sem_flags) 
{ 
    return semget (key, 1, sem_flags); 
} 

int binary_semaphore_deallocate (int semid) 
{ 
    union semun ignored_argument; 
    return semctl (semid, 1, IPC_RMID, ignored_argument); 
} 

int binary_semaphore_initialize (int semid) 
{ 
    union semun argument; 
    unsigned short values[1]; 
    values[0] = 0; 
    argument.array = values; 
    return semctl (semid, 0, SETALL, argument); 
} 

int binary_semaphore_wait (int semid) 
{ 
    struct sembuf operations[1]; 
    operations[0].sem_num = 0; 
    /* Decrement by 1. */ 
    operations[0].sem_op = -1; 
    operations[0].sem_flg = SEM_UNDO; 
    return semop (semid, operations, 1); 
} 

int binary_semaphore_post (int semid) 
{ 
    struct sembuf operations[1]; 
    operations[0].sem_num = 0; 
    /* Increment by 1. */ 
    operations[0].sem_op = 1; 
    operations[0].sem_flg = SEM_UNDO; 
    return semop (semid, operations, 1); 
} 

int main(void) 
{ 
    key_t ipc_key; 
    ipc_key = ftok(".", 'S'); 
    int sem_id; 

    glob_var = (int*)mmap(NULL, sizeof *glob_var, PROT_READ | PROT_WRITE, 
       MAP_SHARED | MAP_ANONYMOUS, -1, 0); 

    *glob_var = 1; 

    if ((sem_id=binary_semaphore_allocation(ipc_key, IPC_CREAT|IPC_EXCL)) != -1) 
    { 
    if (binary_semaphore_initialize(sem_id) == -1) 
    { 
     printf("Semaphore initialization failed"); 
     return 2; 
    } 
    } 

    int ppid = fork(); 
    if (ppid == 0) 
    { 
    if ((sem_id = binary_semaphore_allocation(ipc_key, 0)) == -1) 
    { 
     printf("Child process failed to open semaphore"); 
     return 3; 
    } 
    } 
    else 
    { 
    // Wait in parent process until child update glob_var 
    binary_semaphore_wait(sem_id); 
    } 

    if (ppid == 0) 
    { 
    *glob_var = 92; 
    printf("%d\n", *glob_var); 
    binary_semaphore_post(sem_id); 
    } 
    else if(ppid!=0) 
    { 
    (*glob_var)++; 
    printf("%d\n", *glob_var); 
    munmap(glob_var, sizeof *glob_var); 
    binary_semaphore_deallocate(sem_id); 
    } 

    return 0; 
} 

輸出:

92 
93