linux系统中的多线程互斥量操作demon

/*
	date:2015.12.22
	author:wxs
	demon:pthread using demon
	commd:gcc -o pthread0 pthread0.c  -L /usr/lib/i386-linux-gnu/libpthread.a -lpthread
*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
int num=0;
int num_temp=0;
pthread_mutex_t mylock;//互斥量存在于内核中,一般定义为全局变量
//pthread_mutex_t mylock=PTHREAD_MUTEX_INITIALIZER;//第一种:赋值为常量PTHREAD_MUTEX_INITIALIZER初始化多线程互斥量
//int pthread_mutex_init (pthread_mutex_t *__mutex,  __const pthread_mutexattr_t *__mutexattr);
//int pthread_mutex_destroy (pthread_mutex_t *__mutex);//第二种:使用pthread_mutex_init函数进行初始化多线程互斥量(动态分配)再使用pthread_mutex_destroy函数销毁
//保护读写共享资源线程:线程加解锁,加锁调用pthread_mutex_lock,解锁调用pthread_mutex_unlock
void *add(void *arg) {//线程执行函数,执行300次加法
  int i = 0,tmp;
 pthread_mutex_lock(&mylock);
  for (; i <300; i++)
  {
    tmp=num_temp+1;
    num_temp=tmp;
	//sleep(1);
    printf("add+1,result is:%d\n",num_temp);	
  }
 pthread_mutex_unlock(&mylock);
  return ((void *)0);
}
void *sub(void *arg)//线程执行函数,执行300次减法
{
  int i=0,tmp;
 pthread_mutex_lock(&mylock);
  for(;i<300;i++)
  {

    tmp=num-1;
    num=tmp;
	//sleep(1);
    printf("sub-1,result is:%d\n",num);
  }
 pthread_mutex_unlock(&mylock);
  return ((void *)0);
}
int main(int argc, char** argv) 
{
   
  pthread_t tid1,tid2;
  int err;
  void *tret;
  pthread_mutex_init(&mylock,NULL);
  err=pthread_create(&tid1,NULL,add,NULL);//创建线程
  if(err!=0)
  {
    printf("pthread_create error:%s\n",strerror(err));
    exit(-1);
  }
  err=pthread_create(&tid2,NULL,sub,NULL);
  if(err!=0)
  {
    printf("pthread_create error:%s\n",strerror(err));
     exit(-1);
  }
  err=pthread_join(tid1,&tret);//阻塞等待线程id为tid1的线程,直到该线程退出
  if(err!=0)
  {
    printf("can not join with thread1:%s\n",strerror(err));
    exit(-1);
  }
  printf("thread 1 exit code %d\n",(int)tret);
  err=pthread_join(tid2,&tret);
  if(err!=0)
  {
    printf("can not join with thread1:%s\n",strerror(err));
    exit(-1);
  }
  printf("thread 2 exit code %d\n",(int)tret);
  pthread_mutex_destroy (&mylock);
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C 语言程序,它使用了共享内存和互斥来实现进程间的通信和同步: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <pthread.h> #define SHM_SIZE 1024 struct shared_memory { int counter; }; int main() { int shmid; struct shared_memory *shm; pthread_mutex_t *mutex; // 创建共享内存 shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666); if (shmid < 0) { perror("shmget"); exit(1); } // 将共享内存附加到当前进程 shm = (struct shared_memory *) shmat(shmid, NULL, 0); if (shm == (struct shared_memory *) -1) { perror("shmat"); exit(1); } // 初始化共享内存 shm->counter = 0; // 创建互斥 mutex = (pthread_mutex_t *) shmat(shmid, NULL, 0); if (mutex == (pthread_mutex_t *) -1) { perror("shmat"); exit(1); } pthread_mutex_init(mutex, NULL); // 创建子进程 pid_t pid = fork(); if (pid < 0) { perror("fork"); exit(1); } else if (pid == 0) { // 子进程 int i; for (i = 0; i < 10; i++) { // 加锁 pthread_mutex_lock(mutex); // 计数器加一 shm->counter++; // 解锁 pthread_mutex_unlock(mutex); sleep(1); } } else { // 父进程 int i; for (i = 0; i < 10; i++) { // 加锁 pthread_mutex_lock(mutex); // 计数器加一 shm->counter++; // 解锁 pthread_mutex_unlock(mutex); sleep(1); } } // 销毁互斥 pthread_mutex_destroy(mutex); // 将共享内存从当前进程分离 shmdt(shm); shmdt(mutex); // 删除共享内存 shmctl(shmid, IPC_RMID, NULL); return 0; } ``` 这个程序使用了 `shmget` 函数来创建共享内存,`shmat` 函数将共享内存附加到当前进程,`pthread_mutex_init` 函数创建互斥。子进程和父进程都会对共享内存的计数器进行 10 次加一操作,每次加一之前需要先使用互斥进行加锁,加一完成后再解锁。最后,使用 `pthread_mutex_destroy` 函数销毁互斥,并使用 `shmdt` 函数将共享内存从当前进程分离,最终使用 `shmctl` 函数删除共享内存。 注意:在使用共享内存和互斥时,需要注意避免死锁和竞态条件等问题。建议在使用时仔细阅读相关文档和示例程序,以确保程序的正确性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值