Linux多进程多线程互斥同步例子
2016-07-29 16:16
609 查看
Linux多进程多线程互斥同步例子,运行顺序:先运行进程1,再运行进程2。
进程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|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,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 DEBUG
printf("all thread done!\n");
#endif
return 0;
}
void* threadA(void *prm)
{
Share_Stuff *stuff;
#if DEBUG
printf("thread's prm:%x\n",(unsigned int)prm);
#endif
stuff=(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);
}
}
博客地址:http://www.linuxidc.com/Linux/2013-01/78394.htm
进程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|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,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 DEBUG
printf("all thread done!\n");
#endif
return 0;
}
void* threadA(void *prm)
{
Share_Stuff *stuff;
#if DEBUG
printf("thread's prm:%x\n",(unsigned int)prm);
#endif
stuff=(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);
}
}
博客地址:http://www.linuxidc.com/Linux/2013-01/78394.htm
相关文章推荐
- Linux线程-互斥锁pthread_mutex_t
- Linux Socket编程(不限Linux)
- linux下的定时任务
- CentOS 与 RedHat 关系和区别
- CentOS 7 改用iptables作为防火墙
- Linux基本操作
- 编写ftp客户端连接linux自带ftp服务vsftpd中遇到的问题
- Linux最大线程数限制及当前线程数查询
- linux strace 命令详解
- CentOS6.3 Samba安装配置、多用户、加域
- Linux安装yum命令
- CentOS 7 下yum安装时下载的rpm包存放路径
- linux 添加用户、权限
- linux文件管理相关命令详解
- Linux---free(下)
- Linux---free
- Linux--mkswap
- Linux中openssl命令的使用
- linux下 编译和使用静态库
- linux磁盘限额和进阶文件系统的管理 quota RAID LVM