使用线程同步打印数字的顺序

使用线程同步打印数字的顺序

在这里,我们将看到如何使用不同的线程按正确的顺序打印数字。在这里,我们将创建n个线程,然后对它们进行同步。思路是,第一个线程将打印1,然后第二个线程将打印2,依此类推。当一个线程尝试打印时,它将锁定资源,因此其他线程无法使用该部分。

示例

#include #include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t* cond = NULL;int threads;volatile int count = 0;void* sync_thread(void* num) { //this function is used to synchronize the threads   int thread_number = *(int*)num;   while (1) {      pthread_mutex_lock(&mutex); //lock the section      if (thread_number != count) { //if the thread number is not same as count, put all thread          except one into waiting state         pthread_cond_wait(&cond[thread_number], &mutex);      }      printf("%d ", thread_number + 1); //print the thread number         count = (count+1)%(threads);      // notify the next thread      pthread_cond_signal(&cond[count]);      pthread_mutex_unlock(&mutex);   }   return NULL;}int main() {   pthread_t* thread_id;   volatile int i;   int* thread_arr;   printf("

Enter number of threads: "); scanf("%d", &threads); // allocate memory to cond (conditional variable) thread id's and array of size threads cond = (pthread_cond_t*)malloc(sizeof(pthread_cond_t) * threads); thread_id = (pthread_t*)malloc(sizeof(pthread_t) * threads); thread_arr = (int*)malloc(sizeof(int) * threads); for (i = 0; i < threads; i++) { //create threads thread_arr[i] = i; pthread_create(&thread_id[i], NULL, sync_thread, (void*)&thread_arr[i]); } // waiting for thread for (i = 0; i < threads; i++) { pthread_join(thread_id[i], NULL); } return 0;}

输出

$ g++ test.cpp -lpthread$ ./a.outEnter number of threads: 51 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 34 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 51 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 34 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 12 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 45 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 23 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5.........

以上就是使用线程同步打印数字的顺序的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1445638.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 22:42:22
下一篇 2025年12月14日 08:16:48

相关推荐

  • 在C/C++中的线程函数

    在本教程中,我们将讨论一个程序来理解 C/C++ 中的线程函数。 线程函数允许用户同时实现并发函数,这些函数可以相互依赖用于执行或独立。 示例 #include #include #include void* func(void* arg){ //detaching the current thre…

    2025年12月17日
    000
  • C#中多线程之Thread类详解

    使用system.threading.thread类可以创建和控制线程。 常用的构造函数有: // 摘要: // 初始化 System.Threading.Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。//// 参数: // start:// System.Threading.…

    2025年12月17日
    000
  • C#线程控制的实例详解

    方案一:    调用线程控制方法.启动:Thread.Start();停止:Thread.Abort();暂停:Thread.Suspend();继续:Thread.Resume();   private void btn_Start_Click(object sender, EventArgs e…

    2025年12月17日
    000
  • 具体介绍C#线程与线程池的区别

    线程的建立:(不同于java的是不用再继承thread类) TcpClient tc = tListener.AcceptTcpClient(); CThreadServer ctserver = new CThreadServer(tc); Thread t = new Thread(new Th…

    好文分享 2025年12月17日
    000
  • C# Socket 线程

    最初的版本是这样的:点击打开链接。但一直没有调好,所以就咨询了一下同事翔哥,最后初步搞定! 客户端代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using…

    2025年12月17日
    000
  • C# 多线程经典示例 吃苹果

    本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解。 示例概述:   下面用一个模拟吃苹果的实例,说明C#中多线程的实现方法。要求开发一个程序实现如下情况:一个家庭有三个孩子,爸爸妈妈不断削苹果往盘子里面放,老大、老二、老三不断从盘子里面取苹果吃。盘子的大小有限,最多只能放5个苹…

    2025年12月17日
    000
  • Golang如何测试并发HTTP客户端_Golang并发HTTP客户端测试实践详解

    使用httptest创建mock服务模拟HTTP响应,通过sync.WaitGroup同步并发请求,结合context控制超时,验证请求参数与协程安全,确保客户端在可控环境下正确处理并发场景。 在Go语言中,测试并发HTTP客户端的关键在于模拟HTTP服务、控制并发行为以及验证请求的正确性。直接依赖…

    2025年12月16日
    000
  • python线程强制停止工作

    Python中无法强制终止线程,推荐使用标志位或Event事件实现协作式停止。例如通过设置布尔变量或threading.Event通知线程退出,避免资源泄漏;若需强制终止,可改用multiprocessing.Process及其terminate()方法。 Python 中线程一旦启动,不能直接强制…

    2025年12月15日
    000
  • python创建新线程有哪些方法

    答案:Python中创建线程主要有三种方法:1. 继承threading.Thread类并重写run()方法,适合封装线程逻辑;2. 使用threading.Thread(target=函数)指定目标函数,简洁常用;3. 使用threading.Timer实现延迟执行。推荐使用第二种方式,注意线程安…

    2025年12月14日
    000
  • 利用Python脚本操作在Linux中实现文件备份与同步

    标题:使用Python脚本在Linux中实现文件备份与同步 引言:在日常工作和生活中,文件备份和同步是非常重要的任务。特别是在Linux系统中,我们可以利用Python脚本来自动化这一过程,提高工作效率。本文将介绍如何使用Python脚本实现文件备份与同步的操作,并给出具体的代码示例。 一、文件备份…

    2025年12月13日
    000
  • java 中线程和进程的区别?

    Java程序运行时默认创建一个进程,可包含多个线程;线程共享进程资源但栈独立,创建开销小、通信高效,适合并发编程。 在 Java 中,线程和进程是并发编程中的两个基本概念,它们既有联系也有明显区别。理解它们的差异有助于更好地设计多任务程序。 1. 所属关系与资源占用 进程是操作系统分配资源的基本单位…

    2025年12月2日 java
    000
  • 全网首发:原创SQL数据库同步工具

    程序设计 设计需求 数据同步是分布式系统常常需要考虑的问题,即把分散的数据收集在一起,进行汇总统计。例如,耐克在全球均有分店,假如总店需要掌握分店的销售信息,就需要把分店的销售数据同步到总店。 目前主流数据库主要有两个:SQL Server和Oracle。对 程序设计        设计需求    …

    2025年12月2日 数据库
    000
  • 公交停车场坠楼事件最新进展:正在处理善后工作,警方已经介入

    近日,一则关于上海公交司机坠楼的消息引发社会关注。据了解,事件当事人为上海久事公交集团下属的一名公交车司机。目前,涉事公司已确认此事,并表示警方已介入调查,具体原因仍在调查中,善后工作正在同步进行。 事件基本情况 1、据网络信息,坠楼司机为杨某斌,是上海久事公交集团旗下47路公交车的驾驶员。 2、事…

    2025年12月2日
    000
  • gemini2怎么保存对话历史_gemini2对话历史保存与备份教程

    可通过导出对话、复制粘贴、启用同步或使用API备份Gemini2聊天记录。首先导出为JSON/TXT文件;其次手动复制内容存为带日期命名的文档;再开启账户同步功能确保跨设备保存;最后利用API脚本定时自动归档至数据库或CSV,实现全面备份。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费…

    2025年12月2日 科技
    000
  • 守护线程是什么?

    守护线程是为其他线程服务的后台线程,其生命周期依赖于非守护线程,当所有非守护线程结束时,JVM退出,守护线程随之终止。 守护线程,简单来说,就是默默在后台工作的线程,它的生命周期依赖于其他非守护线程。当所有非守护线程都结束时,守护线程也会随之消亡。 守护线程通常用于执行一些后台任务,比如垃圾回收、日…

    2025年12月2日 java
    000
  • 线程的 run()和 start()有什么区别?

    start()方法启动新线程并执行run()任务,直接调用run()只是同步执行,无法并发。 简单来说, run() 方法是线程要执行的任务,而 start() 方法才是真正启动线程的关键。直接调用 run() 只是普通的方法调用,不会创建新的线程。 线程的 run() 和 start() 区别,这…

    2025年12月1日 java
    000
  • MySql的数据迁移和同步:如何实现多台服务器之间的MySQL数据迁移和同步

    %ignore_a_1%是一个非常流行的开源关系型数据库管理系统,广泛应用于各种web应用、企业系统等。在现代业务的应用场景下,大多数的mysql数据库需要部署在多台服务器上,以提供更高的可用性和性能,这就需要进行mysql数据的迁移和同步。本文将介绍如何实现多台服务器之间的mysql数据迁移和同步…

    数据库 2025年12月1日
    000
  • 【Linux】线程间同步实践 —— 生产消费模型

    在线程互斥的场景中,我们使用锁来确保只有一个线程能够访问临界区,从而保证了线程安全。然而,仅依赖一把锁并不能保证线程访问的顺序性。例如,在学校的vip自习室(仅限一人使用)中,钥匙存放在门口,学生可以取走钥匙进入自习室,离开时将钥匙放回原处。假设小明离开自习室后,将钥匙放回原处,但随后立即又拿起钥匙…

    2025年11月29日 运维
    000
  • miui12怎么取消智能相册_miui12取消智能相册方法

    您是否感到 %%ignore_a_1%gnore_a_1%iui 12 的智能相册占用了大量空间,存储了大量不必要的图片?别担心,php小编新一为您带来了解决方案!本文将详细阐述如何取消 miui 12 的智能相册,帮助您释放宝贵的存储空间。继续阅读,了解如何轻松关闭智能相册并重新掌控您的相册管理。…

    2025年11月29日
    000
  • VSCode设置同步秘籍_多设备开发环境无缝迁移

    答案:VSCode通过登录微软或GitHub账户启用设置同步,可跨设备同步主题、插件、快捷键等配置。具体操作为在命令面板开启“Turn on Settings Sync”,选择同步内容后上传至云端,在新设备登录同一账户并下载设置即可。可同步项包括用户设置、扩展列表、代码片段、UI布局等;不自动同步的…

    2025年11月28日 开发工具
    000

发表回复

登录后才能评论
关注微信