以下内容在 http://peng-wp.iteye.com/blog/1616637 基础上做的修改。
希望通过以下的代码可以加深对共享内存的理解。
注意执行不同的命令得到的结果,及标准输出的顺序。
gcc -DHAVE_LOCK=1 -DSHARE_COUNT=5 -DSHARE_MEM=0 test6.c && ./a.out
@_#-------------->no sleep 4241
@_#-------------->no sleep 4241
@_#-------------->no sleep 4241
@_#-------------->no sleep 4241
@_#-------------->no sleep 4241
@_# 4240---------------->sleep1
@_# 4240---------------->sleep1
@_# 4240---------------->sleep1
@_# 4240---------------->sleep1
@_# 4240---------------->sleep1
in the end, the shared sum: 5
gcc -DHAVE_LOCK=0 -DSHARE_COUNT=5 -DSHARE_MEM=0 test6.c && ./a.out
@_#-------------->no sleep 4246
@_#-------------->no sleep 4246
@_#-------------->no sleep 4246
@_#-------------->no sleep 4246
@_#-------------->no sleep 4246
@_# 4245---------------->sleep1
@_# 4245---------------->sleep1
@_# 4245---------------->sleep1
@_# 4245---------------->sleep1
@_# 4245---------------->sleep1
in the end, the shared sum: 5
gcc -DHAVE_LOCK=0 -DSHARE_COUNT=5 -DSHARE_MEM=1 test6.c && ./a.out
@_#-------------->no sleep 4251
@_#-------------->no sleep 4251
@_#-------------->no sleep 4251
@_#-------------->no sleep 4251
@_#-------------->no sleep 4251
@_# 4250---------------->sleep1
@_# 4250---------------->sleep1
@_# 4250---------------->sleep1
@_# 4250---------------->sleep1
@_# 4250---------------->sleep1
in the end, the shared sum: 10
gcc -DHAVE_LOCK=1 -DSHARE_COUNT=5 -DSHARE_MEM=1 test6.c && ./a.out
@_# 4255---------------->sleep1
@_#-------------->no sleep 4256
@_# 4255---------------->sleep1
@_#-------------->no sleep 4256
@_# 4255---------------->sleep1
@_#-------------->no sleep 4256
@_# 4255---------------->sleep1
@_#-------------->no sleep 4256
@_# 4255---------------->sleep1
@_#-------------->no sleep 4256
in the end, the shared sum: 10
代码如下:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#ifndef _POSIX_THREAD_PROCESS_SHARED
#error "This platform does not support process shared mutex"
#endif
/* Define globally accessible variables and a mutex */
#define NUMTHRDS 4
int* shared_sum = NULL;
pthread_mutex_t *sum_mutex;
int process_fn()
{
int i;
for ( i=0; i < SHARE_COUNT; i++)
{
#if HAVE_LOCK
pthread_mutex_lock(sum_mutex);
#endif
sleep(1);
printf("@_# %d---------------->sleep1 \n", getpid());
*shared_sum += 1;
#if HAVE_LOCK
pthread_mutex_unlock(sum_mutex);
#endif
}
return 0;
}
int process_fnc()
{
int i;
for ( i=0; i < SHARE_COUNT; i++)
{
#if HAVE_LOCK
pthread_mutex_lock(sum_mutex);
#endif
printf("@_#-------------->no sleep %d \n", getpid());
*shared_sum += 1;
#if HAVE_LOCK
pthread_mutex_unlock(sum_mutex);
#endif
}
return 0;
}
int main(int argc, char** argv)
{
int i;
pthread_mutex_t *p_map;
int* temp;
int cpid;
#if SHARE_MEM
p_map=(pthread_mutex_t*)mmap(NULL,sizeof(pthread_mutex_t)*10,PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS,-1,0);
#else
p_map=(pthread_mutex_t*)malloc(sizeof(pthread_mutex_t)*10);
#endif
sum_mutex = p_map;
shared_sum = (int*) (p_map+3);
*shared_sum = 0;
pthread_mutexattr_t mutex_shared_attr;
/* Set pthread_mutex_attr to process shared */
pthread_mutexattr_init(&mutex_shared_attr);
#if SHARE_MEM
pthread_mutexattr_setpshared(&mutex_shared_attr, PTHREAD_PROCESS_SHARED);
#endif
pthread_mutex_init(sum_mutex, &mutex_shared_attr);
cpid = fork();
if(cpid == 0)
{
process_fnc();
return 0;
} else {
process_fn();
waitpid(cpid, NULL, 0);
}
temp = (int*) (p_map+3);
printf("in the end, the shared sum: %d\n",*temp);
return 0;
}