#include <stdio.h>
#include <pthread.h>
static pthread_cond_t cond;
static pthread_mutex_t mutex1;
static pthread_mutex_t mutex2;
void *thread1_entry(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex1);
printf("cond wait cond1\n");
pthread_cond_wait(&cond, &mutex1);
printf("recv cond1\n");
sleep(1);
pthread_mutex_unlock(&mutex1);
}
}
void *thread2_entry(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex1);
printf("cond wait cond2\n");
pthread_cond_wait(&cond, &mutex1);
printf("recv cond2\n");
sleep(10);
pthread_mutex_unlock(&mutex1);
}
}
void *thread3_entry(void *arg)
{
int ret;
while(1)
{
pthread_mutex_lock(&mutex1);
ret = pthread_cond_broadcast(&cond);
if(ret < 0)
{
printf("pthread_cond_broadcast error\n");
}
pthread_mutex_unlock(&mutex1);
sleep(2);
}
}
int main(void)
{
int ret =0;
pthread_t tid1, tid2, tid3;
ret = pthread_cond_init(&cond, NULL);
if(ret < 0)
{
printf("pthread_cond_init error\n");
}
ret = pthread_mutex_init(&mutex1, NULL);
if(ret < 0)
{
printf("pthread_mutex_init error\n");
}
ret = pthread_mutex_init(&mutex2,NULL);
if(ret < 0)
{
printf("pthread_mutex_init error\n");
}
ret= pthread_create(&tid1, NULL, thread1_entry, NULL);
if(ret < 0)
{
printf("pthread_create thread1 error\n");
}
ret = pthread_create(&tid2, NULL, thread2_entry, NULL);
if(ret < 0)
{
printf("pthread_create thread2 error\n");
}
sleep(2);
ret = pthread_create(&tid3, NULL, thread3_entry, NULL);
if(ret < 0)
{
printf("pthread_create thread3 error\n");
}
while(1)
{
sleep(10000);
}
return 0;
}
这段代码由于用了同一个锁,两个线程thread1和thread2是顺序执行,如果把thread2更改成用不同的锁,如下
void *thread2_entry(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex2);
printf("cond wait cond2\n");
pthread_cond_wait(&cond, &mutex2);
printf("recv cond2\n");
sleep(10);
pthread_mutex_unlock(&mutex2);
}
}
两个线程的运行是没有关系的, 并行的。
1.pthread_cond_wait 前后需要加锁,pthread_cond_broadcast前后并不一定要加锁
2.pthread_cond_broadcast能同时唤醒多个在等待的线程,pthread_cond_signal一次只能唤醒一个
https://blog.csdn.net/pengrui18/article/details/70556269
Linux修改系统时间命令_linux更新时间命令
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的方法,够用了。文章目录1、在浮动元素后面加一个空的div,并为它清除浮动2、利用BFC特性清除浮动3、使用:after伪元素,给浮动元素的父元素清除浮动1、在浮动元素后面加一个空的div,并为它清除浮动html代码:<div class="wrap"> <div cla
1. 概述在读鸿洋大神的博客的时候,看到了自定义模板,然后网上查了一些资料,自己了解学习一下,希望和大家分享。我们在创建项目的时候,看到这样一个界面,这里的初始Activity就是模板中的Activity。自定义模板其实模板不只是只有activity 还包括图片自由 布局文件 fragment service 以及一个类都可以制作成模板。慢慢了解,这里只介绍Activity。Android Stu...
大家好,我是一碗周,一个不想被喝(内卷)的前端。如果写的文章有幸可以得到你的青睐,万分有幸~这是【从头学前端】系列文章的第三十七篇-《在表单中常用的伪类选择器》本系列文章在掘金首发,编写不易转载请获得允许本篇文件介绍关于表单输入的伪类,主要介绍三种常用的,具体如下::enabled和:disabled:read-only和:read-write:checked:enabled和:disabled:enabled和:disabled一这组伪类选择器分别表示禁用状态与可用._表单伪类选择器
品牌型号:神舟战神Z7M-KP7GZ操作系统:Win10-64位系统神舟战神Z7M-KP7GZ怎么装win7旗舰版64位?神舟战神Z7M-KP7GZ是一款15.6英寸,预装Windows 10,重2Kg,长度360mm,宽度243mm的影音娱乐本。处理器采用英特尔 酷睿i7 8代系列,CPU主频2.2GHz,六核心/十二线程,内存容量8GB DDR4 2666MHz,硬盘是混合硬盘(SSD+HDD..._z7m-kp7gz
HTML-day03表单一、表单的基本语法form:表单标签内含表单元素,所有要向服务器提交的数据都必须放入表单标签中。属性:method(get/post):提交方式get:参数在地址栏可见,不安全;长度有限制(255)post:参数在地址栏不可见,安全;长度不限action:服务器地址(将表单中的数据提交给服务器)name:表单的内部引用名示例:<form method="post" action="http://www.sohu.com"> 名字_html表格input年龄步长怎么做
201312-1 出现次数最多的数问题描述试题编号: 201312-1 试题名称: 出现次数最多的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。 输入格式 输入的第一行只有一个正整数n(1 ..._接下来的一行,有 n 个正整数,表示集合 s 中的元素。 输出 本题可能有多解,你的代码应给出满足条件的、按升序排列最小的子集。 例:当存在两个解 { 2 , 2 , 6 } 和 { 6 , 4 },则输出 { 2 , 2 , 6 } 这个解。当问题无解时,输出 no solution! 样例输入 复制
html元素 水平居中 于 其父级元素的方法:方法1:复制代码代码如下:左右居中方法1复制代码代码如下:html,body,div{margin:0;padding:0;height:100%;position:relative;}.wrap{width:400px;height:300px;margin:10px;border:1px solid #000;}.left-right-middle..._html怎么让小圆点水平排序
import React, {useState,useEffect} from 'react'import {BrowserRouter as Router,Route,Link} from 'react-router-dom'function Index(){ useEffect(()=>{ console.log('hello,index') return ()=>{ console.log('bye,index')//路由解綁 } },[]._react effect第二个参数
将使用 Excel 表中的数据,在 PowerApps 中自动生成你的第一个画布应用。将选择一个 Excel 文件,生成一个应用,然后运行生成的应用。 每个生成的应用都包括屏幕,用于浏览记录、显示记录的详细信息以及创建或更新记录。 通过生成应用,可以使用 Excel 数据快速利用应用,然后自定义该应用以更好地满足需要。Excel 文件必须位于云存储帐户(如 OneDrive、GoogleDrive..._powerapps 创建excel表格
一.Scrapy框架原理下面是scrapy框架运行的整体原理图其中引擎是框架的整体的核心,负责与各个组件之间通信,下面介绍一下各个组件的具体功能引擎(Scrapy Engine)引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。调度器(Scheduler)调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。下载器(Downloader)下载器负责获取页面数据并提供给引擎,而后提供给spider。SpidersSpider是Scrapy用户编_scrapy源码
这个在2008年写的老帖在网上已经找不到了(之前发表在blogspot和Windows Live Space上,现在都访问不了了),幸好在硬盘上还有备份,重新发上来,以作备忘。//Dll头文件声明AFX_EXT_DATAintD1_nCount;externintD1_nCountE;staticintD1_nCountS=0;..._dll中的静态变量