linux多进程多线程互斥同步例子
进程1
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/shm.h>#include <pthread.h>#include <errno.h>#define DEBUG 1#define SHARE_KEY 0x1234#define THREAD_NUM 4typedef struct{pthread_mutex_t lock;pthread_cond_t cond;char msg[180];int num;}Share_Stuff;static Share_Stuff* stuff[THREAD_NUM];void* threadB(void *prm);int main(int argc,char** argv){void *share_addr=NULL;pthread_t tid[THREAD_NUM];int shmid = -1;int ret=0;int i=0;#if DEBUGprintf("______%s______%s______\n",__DATE__,__TIME__);#endif////////////////////////////////////////////share menory////////////////////////////////////////////shmid = shmget(SHARE_KEY,sizeof(Share_Stuff), 0666|IPC_CREAT);if(shmid == -1){printf("Create share memory fail! - %s\n",strerror(errno));}share_addr=(void*)shmat(shmid,(void*)0,0);if(share_addr < 0){printf("Get share memory address error! - %s\n",strerror(errno));}////////////////////////////////////////////get the addr////////////////////////////////////////////#if DEBUGprintf("share_addr:%x\n",(unsigned int)share_addr);#endiffor(;i<THREAD_NUM;i++){stuff[i]=(Share_Stuff*)share_addr+i;stuff[i]->num=i;#if DEBUGprintf("stuff's addr:%x\n",(unsigned int)stuff[i]);#endif}i=0;////////////////////////////////////////////create_thread////////////////////////////////////////////pthread_condattr_t cond_attr;pthread_condattr_init(&cond_attr);pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);pthread_mutexattr_t mutex_attr;pthread_mutexattr_init(&mutex_attr);pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);for(;i<THREAD_NUM;i++){pthread_cond_init(&stuff[i]->cond, &cond_attr);pthread_mutex_init(&stuff[i]->lock, &mutex_attr);ret=pthread_create(&tid[i],0,threadB,(void*)stuff[i]);if(ret!=0){printf("ThreadA%d create error!\n",i);}}pthread_condattr_destroy(&cond_attr);pthread_mutexattr_destroy(&mutex_attr);i=0;////////////////////////////////////////////wait_for_done////////////////////////////////////////////for(;i<THREAD_NUM;i++){ret=pthread_join(tid[i],NULL);}#if DEBUGprintf("all thread done!\n");#endifreturn 0;}void* threadB(void *prm){Share_Stuff *stuff;#if DEBUGprintf("thread's prm:%x\n",(unsigned int)prm);#endifstuff=(Share_Stuff *)prm;while(1){sleep(1);//printf("pthread_cond_wait\n");pthread_cond_wait(&stuff->cond,&stuff->lock);printf("message:%s",stuff->msg);/*******************************************************/sleep(3);//printf("pthread_mutex_lock\n");pthread_mutex_lock(&stuff->lock);sprintf(stuff->msg,"threadA--%d\n",stuff->num);//printf("pthread_cond_signal\n");pthread_cond_signal(&stuff->cond);//printf("pthread_mutex_unlock\n");pthread_mutex_unlock(&stuff->lock);}}
进程2
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/shm.h>#include <pthread.h>#include <errno.h>#define DEBUG 1#define SHARE_KEY 0x1234#define THREAD_NUM 4typedef struct{pthread_mutex_t lock;pthread_cond_t cond;char msg[180];int num;}Share_Stuff;static Share_Stuff* stuff[THREAD_NUM];void* threadA(void *prm);int main(int argc,char** argv){void *share_addr=NULL;pthread_t tid[THREAD_NUM];int shmid = -1;int ret=0;int i=0;#if DEBUGprintf("______%s______%s______\n",__DATE__,__TIME__);#endif////////////////////////////////////////////share menory////////////////////////////////////////////shmid = shmget(SHARE_KEY,sizeof(Share_Stuff), 0666|IPC_CREAT);if(shmid == -1){printf("Create share memory fail! - %s\n",strerror(errno));}share_addr=(void*)shmat(shmid,(void*)0,0);if(share_addr < 0){printf("Get share memory address error! - %s\n",strerror(errno));}////////////////////////////////////////////get the addr////////////////////////////////////////////#if DEBUGprintf("share_addr:%x\n",(unsigned int)share_addr);#endiffor(;i<THREAD_NUM;i++){stuff[i]=(Share_Stuff*)share_addr+i;stuff[i]->num=i;#if DEBUGprintf("stuff's addr:%x\n",(unsigned int)stuff[i]);#endif}i=0;////////////////////////////////////////////create_thread//////////////////////////////////////////////pthread_condattr_t cond_attr;//pthread_condattr_init(&cond_attr);//pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);//pthread_mutexattr_t mutex_attr;//pthread_mutexattr_init(&mutex_attr);//pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);for(;i<THREAD_NUM;i++){//pthread_cond_init(&stuff[i]->cond, &cond_attr);//pthread_mutex_init(&stuff[i]->lock, &mutex_attr);ret=pthread_create(&tid[i],0,threadA,(void*)stuff[i]);if(ret!=0){printf("ThreadA%d create error!\n",i);}}//pthread_condattr_destroy(&cond_attr);//pthread_mutexattr_destroy(&mutex_attr);i=0;////////////////////////////////////////////wait_for_done////////////////////////////////////////////for(;i<THREAD_NUM;i++){ret=pthread_join(tid[i],NULL);}#if DEBUGprintf("all thread done!\n");#endifreturn 0;}void* threadA(void *prm){Share_Stuff *stuff;#if DEBUGprintf("thread's prm:%x\n",(unsigned int)prm);#endifstuff=(Share_Stuff *)prm;while(1){sleep(3);//printf("pthread_mutex_lock\n");pthread_mutex_lock(&stuff->lock);sprintf(stuff->msg,"threadB--%d\n",stuff->num);//printf("pthread_cond_signal\n");pthread_cond_signal(&stuff->cond);//printf("pthread_mutex_unlock\n");pthread_mutex_unlock(&stuff->lock);/*******************************************************/sleep(1);//printf("pthread_cond_wait\n");pthread_cond_wait(&stuff->cond,&stuff->lock);printf("message:%s",stuff->msg);}}运行顺序:先运行进程1,再运行进程2