技术标签: linux线程信号量 函数
#include
#include /* For O_CREAT constants */
#include /* For sem_ constants */
#include /* For pthread_create constants */
void pthreadRun(void *arg);
void pthreadStop(void *arg);
sem_t* semStop;
sem_t* semRun;
int main()
{
pthread_t pID1, pID2;
int nRetP1, nRetP2;
printf("\n\n");
// 创建信号量
semStop = sem_open("semStop", /*O_RDWR |*/ O_CREAT, 0644, 0); //
semRun = sem_open("semRun,", /*O_RDWR |*/ O_CREAT, 0644,0); //
if(SEM_FAILED == semStop || SEM_FAILED == semRun)
{
printf("Opened error\n");
return 1;
}
// 初始化信号量
sem_init(semStop, 0, 0);
// int sem_init(sem_t *sem, int pshared, unsigned int value);
// If pshared has the value 0, then the semaphore is shared between the threads of a process
// The value argument specifies the initial value for the semaphore.
sem_init(semRun, 0, 0);
// 创建 信号量同步的 线程
printf("now create two threads for synchronization. \n");
nRetP2 = pthread_create(&pID2, NULL, (void*) pthreadStop, NULL);
usleep(2*1000);
nRetP1 = pthread_create(&pID1, NULL, (void*) pthreadRun, NULL);
if(nRetP1 != 0) {
printf("nRetP1 pthread_create failed! \n");
return 2;
}
if(nRetP2 != 0) {
printf("nRetP2 pthread_create failed! \n");
return 2;
}
// 关闭信号量
sem_close(semStop);
sem_close(semRun);
// 暂停 60 秒, 观看两线程同步
usleep(60*1000);
printf("\n\n");
return 0;
}
void pthreadRun(void *arg)
{
while(1)
{
// 等待开车
printf("wait for semRun\n");
sem_wait(semRun);
// 正常行车
printf("runing\n");
// 停车
printf("post semStop\n");
sem_post(semStop);
}
}
void pthreadStop(void *arg)
{
while(1)
{
// 上乘客
printf("get on the bus.\n");
// 关车门,通知司机开车
printf("post semRun.\n");
sem_post(semRun);
// 卖车票
printf("Selling tickets.\n");
// 等待停车
printf("wait for semStop\n");
sem_wait(semStop);
// 下乘客
printf("get off\n");
}
}
/* 编译:(gcc 编译选项需要加入一个多线程选项: -pthread)
hangken@ubuntu:~$ gcc -o bus/bus -g bus/bus.c -pthread
*/
/* 运行结果:
hangken@ubuntu:~$ sudo ./bus/bus
now create two threads for synchronization.
get on the bus.
post semRun.
Selling tickets.
wait for semStop
wait for semRun
runing
post semStop
Segmentation fault
hangken@ubuntu:~$
*/
/* 主要用到的信号量函数有:
sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享。
sem_wait:一直阻塞等待直到信号量>0。
sem_timedwait:阻塞等待若干时间直到信号量>0。 //等待信号量变成>0,
// int sem_wait_i( sem_t *psem, int mswait ) mswait为等待时间,若mswait<0则无穷等待,否则等待若干mswait毫秒
sem_post:使信号量加1。
sem_destroy:释放信号量。和sem_init对应。
关于各函数的具体参数请用man查看。如man sem_init可查看该函数的帮助。
*/
文章浏览阅读6.4k次,点赞20次,收藏54次。接上一篇继续。系统内置Indicator的介绍Backtrader提供了很多内置的Indicator,了解这些Indicator对我们自定义指标、理解现有指标以及制定策略具有重要作用。基本操作类Backtrader提供了很多基本操作类,作为定义其他指标的基准。先看PeriodN,这个类是所有需要使用周期进行计算指标(例如移动平均)的基类:class PeriodN(Indicator): ''' Base class for indicators which take a per_dst[i] = math.fsum(src[i - period + 1:i + 1]) / period indexerror: array ass
文章浏览阅读312次。代码如下:/*---------------------------------------------------------------------------------------------------------*//* *//* Copyright(c) 2015 Nuvoton T_n76e003 开发环境
文章浏览阅读102次。原文链接https://www.cnblogs.com/ambition921009/p/10551959.html1、首先在github上下载g2o图优化库git clone https://github.com/RainerKuemmerle/g2o.git2、运行安装以下依赖库sudo apt-get install libcholmod3.0.6sudo apt-get ...
文章浏览阅读9.2w次,点赞895次,收藏6.5k次。大数据是未来的趋势,在数字化转型时代,把握大数据是关键的!_大数据先学数学还是先学编程
文章浏览阅读1.3k次。一直用的的mybatis进行查询数据,对于有些内容容易忘记,这里整理一下,如果有纰漏请指正!先上简单的代码<select id="getUsernameList" parameterType="java.util.List" resultType="java.lang.String"> select username from sys_user su where su.user_id in <f._mybatisplus根据list集合查询参数
文章浏览阅读8k次,点赞3次,收藏49次。小样本学习(Few-shot Learning)综述 (出自阿里巴巴团队2019年4月)Few-shot Learning: A Survey YAQING WANG1,2 , QUANMING YAO 2019_[7] wang y, yao q. few-shot learning: a survey[j]. 2019.
文章浏览阅读3.7k次,点赞2次,收藏12次。通信传输方式串行通信(二进制) 串行传送,数据是按顺序一位一位传送,一条数据线或差分线传输并行通信 数据各位同时传送,多条数据线比较:串行通常传输速度比较慢,成本低,适用于计算机间的远距离传输。并行传输速率高,成本也高,适用于近距离设备传输,当然了还有RS-485,RS-422,使用了串行差分通信总线,传输速率快,抗干扰性能好,同时传输距离远。同步传输与异步传输_异步串行通信方式数据值怎么求
文章浏览阅读3.8k次。若依自带dynamic-datasource直接使用com.baomidou.dynamic.datasource.annotation.DS注解就可以完成多数据源切换有 dynamic-datasource 就不用添加这个依赖<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId&_若依框架下业务层一个方法下更换数据源调用接口
文章浏览阅读98次。在实现登陆后对admin的增删改查的操作中。http客户端------------->web容器----->struts2过滤器------->struts.xml--->Action----service-->dao->J数据库登陆Action中验证用户是否登陆成功Adminentity;getEntity(){returnen..._java struts2事物
文章浏览阅读544次。前言一个月前曾学习过爬取腾讯动漫全站的示例代码,现在再用scrapy尝试过程新建spider爬虫编写普通selenium爬虫爬取漫画观察网页本次目标是爬取热门排行下的漫画右键检查可以发现漫画标题和链接可以轻松获取(前提是用selenium)一步from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.common.by i
文章浏览阅读2.8k次。看了虾神的文章,大数据之:影像提取中深度学习样本库获取的思考,http://blog.csdn.net/hailiannanhai/article/details/78130042。忍不住自己要试试。下面就写一下试试的过程,用一个矢量要素图层(包含多个面要素),一副影像为基础,用迭代做裁切,循环裁切出一幅一幅的影像。模型图如下所示。左边要素为面矢量要素层,里面含有多个面要素_迭代要素 批量掩膜
文章浏览阅读1.4w次,点赞7次,收藏35次。1.QString转数字QString类提供了非常方便的数字类型转换,包括常用的int float double等,也包括不常用的long long等,具体转换如下: QString string = "1"; int int_string = string.toInt();//int类型 long long_string = string.toLong();//long float float_string = string.toFloat();//float s_数字转qstring