热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:一个线程多次调用一个函数

篇首语:本文由编程笔记#小编为大家整理,主要介绍了一个线程多次调用一个函数相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了一个线程多次调用一个函数相关的知识,希望对你有一定的参考价值。



说有这个整数A。每次func()运行时,将A增加1.并且我用2个线程调用此函数。示例:如果用户给出输入5,则每个线程运行5次,这使得A = 10

这就是我在主线程中所拥有的:

for ( i = 0; i <5; i++)
{
pthread_create(&thread1, NULL, (void*)func, (void*)args);
pthread_create(&thread2, NULL, (void*)func, (void*)args2);
}
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);

我的方式是,如果用户希望每个线程运行5次。我将创建一个循环,每次创建“新”线程,这实际上是覆盖。我想我们可以说我打了10个线程,或者我使用了pthread_create() 10次。

但我被告知这是错的。应该是我只创建了2个线程,每个线程运行5次。但后来我不明白,我怎么能用每个线程调用该函数5次。如果我想要一个函数,我每次都必须使用pthread_create(),对吧?

无论如何,如果没有循环pthread_create() 5次,我仍然可以用线程调用func() 5次?


答案

不,你不可能多次运行one run thread,因为for n number of thread creation, you have to declare that many no of threads和线程共享它们运行的​​进程的地址空间,并且一旦使用pthread_join()收集返回状态,就有自己的堆栈来运行线程函数,thread_1是完成后,再也无法运行了。 thread1

因此,只有解决方案是创建5个pthread_t变量或创建array of pthread_t

解决方案-1:

int main()
{
pthread_t thread1,thread2,thread3,thread4,thread5;
pthread_create(&thread1, NULL, (void*)func1, (void*)args1);
pthread_create(&thread2, NULL, (void*)func2, (void*)args2);
pthread_create(&thread3, NULL, (void*)func3, (void*)args3);
pthread_create(&thread4, NULL, (void*)func4, (void*)args4);
pthread_create(&thread5, NULL, (void*)func5, (void*)args5);
//and that many times you should use pthread_join() to avoid undefined behaviour
/*If multiple threads simultaneously try to join with the same thread, the results are undefined. If the thread calling pthread_join() is cancelled,
then the target thread will remain joinable*/
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
...
pthread_join(thread5, NULL);
}

解决方案2:

pthread_t thread_var[5];
for(i=0 ;i<5 ;i++) {
pthread_create(&thread_var[i],NULL,/** call through fun-ptr**/,(void*)args);
}

正如其他人所指出的那样由于你只为5个线程定义了一个处理程序func,所有线程都在访问same thread handler(func),它可能会在unexpected result中产生,因为所有线程都试图在access/modify中使用func相同的变量。

无论如何,如果没有循环pthread_create()5次,我仍然可以使用线程调用func()5次?

我认为意图可能是不要将func() from main thread称为5次,这是不可能的,而不是运行main thread only oncefunc()你可以使用thread_handler在不同的mutex之间切换。

pthread_mutex_t m1,m2,m3;
void* fun1(void *p)
{
pthread_mutex_lock(&m1);
/** do ssome task here**/
sleep(1);
pthread_mutex_unlock(&m2);
}
void* fun2(void *p)
{
pthread_mutex_lock(&m2);
/** do some task here **/
sleep(1);
pthread_mutex_unlock(&m3);
}
void* fun3(void *p)
{
pthread_mutex_lock(&m3);
/*** do some task here **/
sleep(1);
pthread_mutex_unlock(&m1);
}


推荐阅读
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 华为云openEuler环境下的Web应用部署实践
    本文详细记录了在华为云openEuler系统上进行Web应用部署的具体步骤,包括配置yum源、安装Apache、MariaDB、PHP及其相关组件,并完成WordPress的安装与配置过程。 ... [详细]
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • Python Selenium WebDriver 浏览器驱动详解与实践
    本文详细介绍了如何使用Python结合Selenium和unittest构建自动化测试框架,重点解析了WebDriver浏览器驱动的配置与使用方法,涵盖Chrome、Firefox、IE/Edge等主流浏览器。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • 探讨多种方法来确定Java对象的实际类型,包括使用instanceof关键字、getClass()方法等。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • 在MFC框架中,存在多个全局函数,用于在不同对象间获取信息或创建新对象。其中,`afxGetApp`函数尤为关键,它能够帮助开发者轻松获取当前应用程序的实例指针。本文将详细解析`afxGetApp`函数的内部机制及其在MFC应用程序中的具体应用场景,探讨其在提升代码可维护性和灵活性方面的优势。此外,还将介绍其他常用全局函数如`AfxWinInit()`和`AfxBeginThread()`的功能和使用方法,为开发者提供全面的参考。 ... [详细]
author-avatar
CK92_474
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有