条件变量--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

相关文章

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

Python变量与数据类型全解析(最新整理)

《Python变量与数据类型全解析(最新整理)》文章介绍Python变量作为数据载体,命名需遵循字母数字下划线规则,不可数字开头,大小写敏感,避免关键字,本文给大家介绍Python变量与数据类型全解析... 目录1、变量变量命名规范python数据类型1、基本数据类型数值类型(Number):布尔类型(bo

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、