条件变量--pthread_cond_t(小程序)

2024-08-25 00:32

本文主要是介绍条件变量--pthread_cond_t(小程序),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

条件变量,利用线程共享全局数据机制来进行同步,两种操作,一种是等待条件成立而挂起,另一种是给出条件成立的信号。
(1)int pthread_cond_t mycond; 定义一个条件变量
         两种初始化方式,第一种使用常量PTHREAD_COND_INITIALIZER,
         第二种使用int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *attr)
(2)int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex),等待条件cond成立,线程阻塞,解开mutex。当条件成立后,对mutex加锁,然后回到线程运行中。
(3)int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)    在有限的时间内等待,超过时间以后返回ETIMEOUT
(4)int pthread_cond_signal(pthread_cond_t *cond),发送成功信号,激活一个等待该信号的线程。
(5)int pthread_cond_broadcast(pthread_cond_t *cond),发送成功信号,激活所有等待该信号的线程。
互斥锁贯穿在条件变量中间。
计算完美数,如果一个数的所有小于自身的因子的和仍然等于自身,如果6 = 1 + 2 + 3,这样的数叫做完美数,用多线程完成这个操作,并让结果输出到文件中。主线程完成计算,thread完成输出到文件中,用双重vector存贮,如果vector不为空,就向文件中输出。使用条件变量和互斥锁完成。

#include <iostream>
#include <fstream>
#include <pthread.h>
#include <vector>
#include <time.h>
using namespace std;
#define MAXN 100000
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
vector<vector<int> > vec;
void deal(void *arg) {vec.clear();//vector<vector<int> >().swap(vec);pthread_mutex_unlock(&mutex);return ;
}
void *print(void *arg) {pthread_cleanup_push(deal, NULL);pthread_mutex_lock(&mutex);ofstream fcout("./text");while( true ) {while( !vec.size() ) {pthread_cond_wait(&cond, &mutex);}auto vec_iter = vec.end()-1;for(auto iter = vec_iter->begin(); iter < vec_iter->end(); iter++) {if( iter == vec_iter->end()-2 ) fcout << *iter << "=";else if( iter == vec_iter->end()-1 ) fcout << *iter << "\n";else fcout << *iter << "+";for(int i = 1; i <= 1000000; i++) fcout << i;		}vec.erase(vec_iter);//vector<int>().swap(*vec_iter);}pthread_mutex_unlock(&mutex);pthread_cleanup_pop(0);return NULL;
}
int main() {time_t start = clock();pthread_t pthread;auto state = pthread_create(&pthread, NULL, print, NULL);if( state ) {cout << "thread error" << endl;}vec.clear();//vector<vector<int> >().swap(vec);for(int i = 1; i <= MAXN; i++) {pthread_mutex_lock(&mutex);int sum = 0;vec.push_back( vector<int>() );for(int j = 1; j < i; j++) {if( i%j == 0 ) {sum += j;auto iter = vec.end()-1;iter->push_back(j);}}auto iter = vec.end()-1;iter->push_back(i);if( sum == i  ) {pthread_cond_signal(&cond);}else {vec.erase(iter);//vector<int>().swap( *iter );}pthread_mutex_unlock(&mutex);}pthread_cancel(pthread);pthread_join(pthread, NULL);time_t end = clock();cout << end-start << endl;return 0;
}


这篇关于条件变量--pthread_cond_t(小程序)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104049

相关文章

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker