日期:2014-05-16 浏览次数:20817 次
进程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 4 typedef 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 DEBUG printf("______%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 DEBUG printf("share_addr:%x\n",(unsigned int)share_addr); #endif for(;i<THREAD_NUM;i++){ stuff[i]=(Share_Stuff*)share_addr+i; stuff[i]->num=i; #if DEBUG printf("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 DEBUG printf("all thread done!\n"); #endif return 0; } void* threadB(void *prm) { Share_Stuff *stuff; #if DEBUG printf("thread's prm:%x\n",(unsigned int)prm); #endif stuff=(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 4 typedef 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 DEBUG printf("______%s______%s______\n",__DATE__,__TIME__); #endif ////////////////////////////////////////////share menory//////////////////////////////////////////// shmid = shmget(SHARE_KEY,sizeof(Share_Stuff), 0666