Linux 多线程编程( POSIX )( 三 )------->代码区

转自:http://blog.sina.com.cn/s/blog_6dc9e4cf0100xdfc.html


1.sem_open与sem_close与sem_unlink与sem_getvalue

#include <stdio.h>
#include <semaphore.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main( int argc, char ** argv )
{
 

    sem_t                sem;     
      int                        val;
           
      if( argc !=2 )
      {
            printf("请输入文件名!\n");
            exit(EXIT_FAILURE );
      }
     
      //!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      //!> 创建信号灯
     
      if( ( sem =sem_open( argv[1], O_CREAT, 0644, 1 ) ) == SEM_FAILED )
                                                                      //!> if 失败,报错... ...
            printf("创建信号灯失败...\n");
            exit(EXIT_FAILURE );
      }
      else
      {
            printf("创建信号灯OK ...\n");
      }
     
      //!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      //!> 获取指定信号灯的当前值
     
      if(sem_getvalue( sem, &val ) != 0 )
      {
            printf("获取值失败...\n");
            exit(EXIT_FAILURE );
      }
      else
      {
            printf("获取值为VAL == %d\n", val);
      }

      //!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      //!> 关闭信号灯
     
      if(sem_close( sem ) != 0 )
      {
            printf("Close 信号灯失败...\n");
            exit(EXIT_FAILURE );
      }
      else
      {
            printf("Close 信号灯OK....\n");
      }

      //!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      //!> 删除信号灯
     
      if(sem_unlink( argv[1] ) != 0 )
      {
            printf("删除信号灯失败....\n");
            exit(EXIT_FAILURE );
      }
      else
      {
            printf("删除信号灯成功...\n");
      }

      return0;
}
            结果:
            创建信号灯OK...
            获取值为VAL ==1
            Close信号灯OK....
            删除信号灯成功...

2.测试sem_close与sem_unlink不一样

//!> 测试sem_close与sem_unlink不一样
//!> 也就证明close后,再次重启一个进程还
//!> 可以访问没有删除的信号灯
//!> 创建一个名称为“shanshan”的信号灯

//!> CODE 1

#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <unistd.h>
#include <fcntl.h>

int main( int argc, char ** argv )
{
      sem_t                sem;
           
      if( argc !=2 )
      {
            printf("请输入文件名....\n");
            exit(EXIT_FAILURE );
      }

      if( ( sem =sem_open( argv[1], O_CREAT, 0644, 1 ) ) == SEM_FAILED)      //!> Create
      {
            printf("创建信号灯失败....\n");
            exit(EXIT_FAILURE );
      }
      else
      {
            printf("创建信号灯OK...\n" );
      }
     
      sem_close(sem );                  //!> Close

      return0;
}

终端Copy:
pt@ubuntu:~/桌面/net programming/5_线程通信_POSIX_5/3_信号灯_3/CODE/测试关闭 !=删除$  ./t1 shanshan
创建信号灯OK...

//!> 测试sem_close与sem_unlink不一样
//!> 也就证明close后,再次重启一个进程还
//!> 可以访问没有删除的信号灯
//!> 创建一个名称为“shanshan”的信号灯

//!> CODE 2

#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <unistd.h>
#include <fcntl.h>

int main( int argc, char ** argv )
{
      sem_t            * sem =NULL;
     
      sem =sem_open( argv[1], 0);            //!> 打开已经创建的信号灯
                                                                  //!> 没有创建哦~
      if( sem&& sem != SEM_FAILED)      //!> Success
      {
            printf("打开已经创建的信号灯OK ...\n");
      }
      else
      {
            printf("打开已经创建的信号灯失败...\n");
            exit(EXIT_FAILURE );
      }
     
      sem_close(sem );                  //!> 关闭
      sem_unlink(argv[1] );                  //!> 删除
     
      return0;
}
终端Copy:
pt@ubuntu:~/桌面/net programming/5_线程通信_POSIX_5/3_信号灯_3/CODE/测试关闭 !=删除$ ./t2 shanshan
打开已经创建的信号灯OK ...

//!> 注意:终端输入的参数与CODE 1应该是一样的!!!


3.sem_wait测试

//!> 创建多线程并使用sem_wait互斥
//!> 做1+2+...+10

#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>

int g_i = 0;                                      //!> 全局增量(共享变量)
int g_sum =0;                          //!> 结果保存(共享变量)
sem_t                sem;            //!> 创建一个信号量

//!> 创建信号灯
void create_sem( char  name[] )
{
      if( ( sem =sem_open( name, O_CREAT, 0644, 1 ) ) ==SEM_FAILED  )
      {
            printf("创建信号灯失败...\n");
            exit(EXIT_FAILURE );
      }
      else
      {
            printf("创建信号灯OK....\n");
      }
}

//!> 线程1入口
void * entrance_1( void * arg )
{
      for( g_i =0; g_i < 11; g_i++ )
      {
            sem_wait(sem );            //!> 加锁
           
            printf("线程1在执行....\n" );
            g_sum +=g_i;
           
            sem_post(sem );            //!> 解锁
            sleep( 2);
      }
}

//!> 线程2入口
void * entrance_2( void * arg )
{
      for( g_i =0; g_i < 11; g_i++  )
      {
            sem_wait(sem );            //!> 加锁
           
            printf("线程2在执行....\n" );
            g_sum +=g_i;
           
            sem_post(sem );            //!> 解锁
            sleep( 3);
      }
}

//!> 创建两个线程
void create_threads( pthread_t * ptid1, pthread_t * ptid2 )
{
      if(pthread_create( ptid1, NULL, entrance_1, NULL ) != 0 )
      {
            printf("创建线程1失败...\n");
            exit(EXIT_FAILURE );
      }
      else
      {
            printf("创建线程1OK ....\n");
      }
     
      if(pthread_create( ptid2, NULL, entrance_2, NULL ) != 0 )
      {
            printf("创建线程2失败...\n");
            exit(EXIT_FAILURE );
      }
      else
      {
            printf("创建线程2OK ....\n");
      }
}

//!> do and wait
void do_and_wait( pthread_t tid1, pthread_t tid2 )
{
      if( tid1 !=-1 )
      {
            pthread_join( tid1, NULL );
      }
      else
      {
            printf("线程1错误...\n");
            exit(EXIT_FAILURE );
      }
     
      if( tid2 !=-1 )
      {
            pthread_join( tid2, NULL );
      }
      else
      {
            printf("线程2错误...\n");
            exit(EXIT_FAILURE );
      }
}

//!> 关闭and删除信号灯
void close_and_del_sem( char * name )
{
      if(sem_close( sem ) != 0 )
      {
            printf("关闭信号灯失败...\n");
            exit(EXIT_FAILURE );
      }
      else
      {
            printf("关闭信号灯OK ...\n");
      }
     
      if(sem_unlink( name ) != 0 )
      {
            printf("删除信号灯失败...\n");
            exit(EXIT_FAILURE );
      }
      else
      {
            printf("删除信号灯OK....\n");
      }
     
}

int main( int argc, char ** argv )
{
      pthread_t            tid1 =-1;
      pthread_t        tid2 = -1;            //!> 创建两个线程
     
      if( argc !=2 )
      {
            printf("请输入文件名!\n");
            exit(EXIT_FAILURE );
      }
     
      create_sem(argv[1] );                  //!> 创建信号灯
      create_threads( &tid1, &tid2);      //!>创建线程     
      do_and_wait(tid1, tid2 );            //!> 子线程处理+等待子线程
      close_and_del_sem( argv[1]);      //!> 关闭和删除信号灯
     
      printf("子线程运行结束!\n");
      printf("结果g_sum == %d\n", g_sum);
      printf("我是主线程,我的 ID == %d\n", (unsigned)pthread_self());
     
      return0;
}
        ./c shanshan
      结果:
      创建信号灯OK....
      创建线程1OK....
      创建线程2OK....
      线程1在执行....
      线程2在执行....
      线程1在执行....
      线程2在执行....
      线程1在执行....
      线程2在执行....
      线程1在执行....
      线程1在执行....
      线程2在执行....
      线程1在执行....
      线程2在执行....
      线程1在执行....
      关闭信号灯OK...
      删除信号灯OK....
      子线程运行结束!
      结果g_sum ==55
      我是主线程,我的 ID== 927221504

4.应用Posix有名信号灯。限制访问共享代码的进程数目

#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <unistd.h>
#include <fcntl.h>

sem_t           sem;    //!> 信号灯
int                      val;            //!>信号灯当前值     


void print_info( pid_t pid )
{
      printf("我的ID== %d\n", (int)pid);
      sem_getvalue( sem, &val );
      printf("当前信号灯值 == %d\n", val);
}

int main( int argc, char  ** argv )
{
      int i =0;
     
      if( argc !=2 )
      {
            printf("请输入文件名!\n");
            exit(EXIT_FAILURE );
      }

      if(sem_open( argv[1], O_CREAT, 0644, 2 ) == SEM_FAILED)            //!> 初始化有两个可用src
      {
            printf("创建信号灯失败...\n");
            exit(EXIT_FAILURE );
      }
     
      while( i++< 5 )
      {
            if( fork()0= 0 )            //!> 创建进程
            {
                  sem_wait(sem );      //!> P 操作
                  print_info(getpid() );
                  sleep(1);
                  sem_post(sem );      //!> V 操作
                  printf("我的ID== %d, 运行结束....\n", (int)getpid());
                  return0;
            }
      }

      wait();
      sem_close(sem );            //!> 关闭
      sem_unlink(argv[1] );            //!> 删除
      return0;
}


5.应用posix基于内存的信号灯实现一个进程的各个线程间的互斥

#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>

sem_t            sem;            //!> 信号灯
int                   value;            //!> 信号量


void * entrance( void * arg )
{
      sem_wait(&sem);      //!> 计数信号灯
      print_info();
      sleep( 2);
      sem_post(&sem);      //!> V 操作
     
      printf("我的ID== %d, 运行结束....\n", (unsigned)pthread_self());
      pthread_exit( arg );
     
}

void print_info()
{
      printf("输出线程ID == %d\n", (unsigned)pthread_self());
      sem_getvalue( &sem, &value );
      printf("信号灯当前数量: %d\n", value );
}

int main( )
{
      int n =0;
      pthread_ttid;

      if(sem_init( &sem, 0, 2 ) != 0)      //!> 线程共享,量==2
      {
            printf("sem_init 失败...\n");
            exit(EXIT_FAILURE );
      }
     
      while( n++< 5)            //!> 创建5个线程
      {
            if(pthread_create( &tid, NULL, entrance, NULL ) != 0)
            {
                  printf("创建线程%d 失败....\n", n);
                  exit(EXIT_FAILURE );
            }
      }
     
      pthread_join( tid, NULL );
     
      return0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地之一,近年来域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值