加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱资讯网 (https://www.52junxun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Unix/Linux线程同步互斥量的使用

发布时间:2022-11-03 12:46:43 所属栏目:Unix 来源:
导读:  Unix/Linux线程同步互斥量的使用

  在main函数中创建3个子线程,并实时输出当前子线程数,当每创建一个子线程的时候,就对线程数变量加一unix线程切换,每个子线程运行3秒,3秒之后对子线程数变量值减一。
  Unix/Linux线程同步互斥量的使用
 
  在main函数中创建3个子线程,并实时输出当前子线程数,当每创建一个子线程的时候,就对线程数变量加一unix线程切换,每个子线程运行3秒,3秒之后对子线程数变量值减一。当线程数为0时主线程退出。在对子线程数的读写过程中都使用到了线程同步的互斥量函数pthread_mutex_lock() 和 pthread_mutex_unlock()。
 
  Demo代码如下:
 
  /**
   * Author: ACb0y
   * FileName: main.cpp
   * CreateTime: 2011-10-12 23:19:34
   * Version: 1.0
   */
  #include
  #include
  #include "apue.h"
  #include "err_msg.h"
  using namespace std;
  struct ChildThreadInfo
  {
   int cnt;
   pthread_mutex_t lock;
  };
  ChildThreadInfo childThreadInfo;
  void * ThreadRun(void *arg)
  {
   int id = *((int *)arg);
   int count = 0;
   pthread_mutex_lock(&childThreadInfo.lock);
   childThreadInfo.cnt++;
   pthread_mutex_unlock(&childThreadInfo.lock);
   while (count != 3)
   {
   sleep(1);
   count++;
   cout << "Thread " << id << " run " << count << " second" << endl;
   }
   pthread_mutex_lock(&childThreadInfo.lock);
   childThreadInfo.cnt--;
   pthread_mutex_unlock(&childThreadInfo.lock);
  }
  int main()
  {
   pthread_t tid;
   int id = 0;
   while (true)
   {
  
   if (id < 3)
   {
   ++id;
   pthread_create(&tid, NULL, ThreadRun, (void *)&id);
   }
  
   sleep(1);
   pthread_mutex_lock(&childThreadInfo.lock);
   cout << "child thread count = " << childThreadInfo.cnt << endl;
   pthread_mutex_unlock(&childThreadInfo.lock);
   if (childThreadInfo.cnt == 0)
   {
   break;
   }
   }
   cout << "all child threads stop and exit" << endl;
   return 0;
  }

  附上makefile.mk 文件
 
  include ../../../pathenv.mk
  MAIN_TARGET=../Out
  SRC_PATH1=$(COMMON_PATH)
  SRC_PATH2=../src
  OBJ_PATH=../obj
  FILE_1=main.cpp
  SRC_1=$(SRC_PATH2)/$(FILE_1)
  OBJ_1=$(OBJ_PATH)/$(FILE_1:.cpp=.o)
  CXX=g++
  CXXFLAG=-g -D_DEBUG
  LIBS= -lpthread
  INCLUDE_PATH=-I$(SRC_PATH1) -I$(SRC_PATH2)
  COMPILE_CPP=$(CXX) $(CXXFLAG) $(INCLUDE_PATH) -o $@ -c $?
  COMPILE_LINK=$(CXX) $(CXXFLAG) $(INCLUDE_PATH) $(LIBS) -o $@
  OBJS=$(OBJ_1)
  $(MAIN_TARGET)::$(OBJS)
   $(COMPILE_LINK) $(OBJS)
  $(OBJ_1)::$(SRC_1)
   $(COMPILE_CPP)
  PHONY: clean
  clean:
   rm $(OBJS)
 
 

(编辑:我爱资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章