找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6460|回复: 0

共享内存的多进程数据共享的一致性解决

[复制链接]
发表于 2015-1-29 14:11:34 | 显示全部楼层 |阅读模式
最近终于有点有时间,在自己的任务日志中添加了一项
"研究多进程下共享内存数据的一致性"
经过两天的研究,写出了测试代码,并且测试通过。
很棒,解决了困扰我我好几年的一个疑惑。
不考虑windows了,Linux是我的主要开发环境。
代码如下:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/ipc.h>
  4. #include <sys/shm.h>
  5. #include <pthread.h>
  6. //add by freeeyes
  7. //此测试代码,解决的是在多进程下,共享内存的安全性。
  8. //测试用例是,一个进程创建10个线程,每个线程写100000次。
  9. //再开两个进程,模拟多子进程写入,创造竞争机会
  10. //思路,在共享内存中,记录一个pthread_mutex_t对象
  11. //对这个线程锁对象添加属性,PTHREAD_PROCESS_SHARED
  12. //效果不错 ^^
  13. #define PERMS_IPC 0600
  14. //测试类
  15. struct _TestData
  16. {
  17.         pthread_mutex_t m_lock;
  18.         int m_Data;
  19.        
  20.         _TestData()
  21.         {
  22.                 m_Data = 0;
  23.         }
  24. };
  25. //测试共享内存下线程锁的作用
  26. char * CreatShm(key_t shmkey, int length)
  27. {
  28.         int        shmid;
  29.         char *shmp;
  30.         if((shmid = shmget(shmkey, length, PERMS_IPC|IPC_CREAT)) < 0)
  31.         {
  32.                 return NULL;
  33.         }
  34.         if((shmp = (char *)shmat(shmid, (char *)0, 0)) == (char *) -1)
  35.         {
  36.                 return NULL;
  37.         }
  38.         return shmp;
  39. }
  40. void * threadFunc(void *arg)  
  41. {  
  42.    _TestData* pTestData = (_TestData* )arg;
  43.    
  44.    for(int i = 0; i < 100000; i++)
  45.    {
  46.                    //这里添加对测试数据的锁判定
  47.                    pthread_mutex_lock(&pTestData->m_lock);
  48.                    pTestData->m_Data++;
  49.                    //usleep(1);
  50.                    pthread_mutex_unlock(&pTestData->m_lock);
  51.    }
  52.    
  53.    return ((void *)0);  
  54. }  
  55. int main()
  56. {
  57.         char* pData = CreatShm(10031, sizeof(_TestData));
  58.         if(NULL == pData)
  59.         {
  60.                 printf("[Main]Create shm fail.\n");
  61.         }
  62.         else
  63.         {
  64.                 /* 关键在这里 */
  65.                 pthread_mutexattr_t mattr;   
  66.                 pthread_mutexattr_init(&mattr);   
  67.                 pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);          
  68.                
  69.                 pthread_mutex_t lock;       
  70.                 pthread_mutex_init(&lock, &mattr);
  71.                
  72.                 _TestData* pTestData = (_TestData* )pData;
  73.                
  74.                 pTestData->m_lock = lock;
  75.                 pTestData->m_Data = 0;
  76.                
  77.                 //创建两个子进程,模拟多进程间的数据写同步
  78.                 for(int k = 0; k < 2; k++)
  79.                 {
  80.                         //多进程
  81.                         pid_t pid = fork();
  82.                
  83.                         //子进程
  84.                         if(pid == 0)
  85.                         {
  86.                                 //开始测试多线程
  87.                                 pthread_t nThreadID[10];
  88.                                 for(int i = 0; i < 10; i++)
  89.                                 {
  90.                                         pthread_create(&nThreadID[i], NULL, threadFunc, (void*)pTestData);
  91.                                 }
  92.                        
  93.                                 for(int i = 0; i < 10; i++)
  94.                                 {
  95.                                         pthread_join(nThreadID[i], NULL);
  96.                                 }
  97.                        
  98.                                 printf("[main]Data=%d.\n", pTestData->m_Data);
  99.                                
  100.                                 return 0;
  101.                         }
  102.                         printf("[main]loop end.\n");
  103.                 }
  104.                
  105.                 printf("[main]father ok.\n");
  106.         }
  107.        
  108.         return 0;
  109. }
复制代码
此代码在Linux下测试通过。
[m2mjk@nbc testlock]$ g++ -Wall -g -rdynamic -ldl -lpthread main.cpp -o test
[m2mjk@nbc testlock]$ ./test
[main]loop end.
[main]loop end.
[main]father ok.
[main]Data=1992233.
[main]Data=2000000.

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 10:58 , Processed in 0.014573 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表