linux多进程多线程互斥同步例子
来源:互联网 发布:淘宝网的货源哪里找 编辑:程序博客网 时间:2024/06/05 06:31
进程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)*THREAD_NUM, 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)*THREAD_NUM, 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
- linux多进程多线程互斥同步例子
- linux多进程多线程互斥同步例子
- linux多进程多线程互斥同步例子
- Linux多进程多线程互斥同步例子
- 同步与互斥(多线程/多进程)
- 多线程,进程,同步互斥
- JAVA多线程互斥同步例子
- 一个例子展开,介绍Linux下面线程的操作、多线程的同步和互斥。
- 本文一个例子展开,介绍Linux下面线程的操作、多线程的同步和互斥
- 一个例子展开,介绍Linux下面线程的操作、多线程的同步和互斥。
- linux的进程同步和互斥
- linux 多线程编程 同步与互斥
- linux多线程的互斥与同步
- linux多线程编程 同步与互斥
- Linux多线程编程--同步与互斥
- Linux多线程编程--同步与互斥
- Linux多线程的同步与互斥
- Linux多线程的同步与互斥
- 非常简单的Jquery版checkbox全选反选功能
- 华为网络安全白皮书
- GridView那点事之【如何使用ExecuteReader()来绑定数据显示到表格中】 .
- inux文件权限详解
- java.io之文件
- linux多进程多线程互斥同步例子
- poi解析word
- Session的使用
- Java中PDF操作类库iText介绍
- Strust2+JavaBean+DAO开发示例
- com.ibm.icu.text.SimpleDateFormat 的陷阱
- Android中判断网络是否连接并提示设置
- 类似百度文库在线预览文档flash版(支持word、excel、ppt、pdf)+在线预览文档html版
- Java操作PDF之iText超入门