问题:
有四个线程1,2,3,4,线程1的功能就是输出1,线程2的功能就是输出2,以此类推....
现在有四个文件.ABCD.初始都为空(pthread + C/C++ 谷歌笔试题)。
现要让四个文件呈如下格式:
A: 1 2 3 4 1 2....
B: 2 3 4 1 2 3....
C: 3 4 1 2 3 4....
D: 4 1 2 3 4 1....
解法:
#include<stdio.h> #include<stdlib.h> #include<pthread.h> #include<unistd.h> //线程的数量 const int THREAD_NUM = 4; FILE* fp[THREAD_NUM]; pthread_t threads[THREAD_NUM]; //每个线程写字符的次数 const int ch_num = 10; int thread_ids[THREAD_NUM]; //记录文件里的字符的个数对线程数取模 int file_ch_num[THREAD_NUM]; //完成某一轮的线程的数目 int finish_turn[ch_num]; /* * @brief 判断数组里所有的都元素的值是否都相等 */ bool is_all_same(int* ar, int n){ for(int i = 1; i < n; i++){ if(ar[i] != ar[0]) return false; } return true; } bool ouput_ar(int* ar, int n){ printf("\n"); for(int i = 0; i < n; i++){ printf("[%d, %d]", i, ar[i]); } printf("\n"); return true; } /* * @brief 写文件 * @param int thread_id 线程的序数,从0开始 */ void* write_to_file(void* thread_id_ptr){ int thread_id = *((int*)thread_id_ptr); int file_pos = thread_id; //当前线程输出的数字 int number = thread_id + 1; for(int i = 0; i < ch_num; i++){ while(true){ //如果上一轮还有线程未完成则停留下 if(i > 0 && finish_turn[i -1 ] < THREAD_NUM){ usleep(100); continue ; } if((file_pos + file_ch_num[file_pos]) % THREAD_NUM == thread_id) break; usleep(100); } fprintf(fp[file_pos], "%d ", number); file_ch_num[file_pos]++; if(file_ch_num[file_pos] >= THREAD_NUM) file_ch_num[file_pos] = 0; file_pos--; if(file_pos < 0) file_pos = THREAD_NUM - 1; finish_turn[i]++; } return NULL; } int main(int argc, char* argv[]){ for(int i = 0; i < THREAD_NUM; i++){ char fname[32]; sprintf(fname, "/tmp/pthread/%c", 'A'+i); fp[i] = fopen(fname, "w+"); file_ch_num[i] = 0; } for(int i = 0; i < THREAD_NUM; i++){ thread_ids[i] = i; } for(int i = 0; i < ch_num; i++){ finish_turn[i] = 0; } for(int i = 0; i < THREAD_NUM; i++){ pthread_create(threads+i, NULL, write_to_file, thread_ids+i); } for(int i = 0; i < THREAD_NUM; i++){ pthread_join(threads[i], NULL); } for(int i = 0; i < THREAD_NUM; i++){ if(fp[i]) fclose(fp[i]); } return 0; }
相关推荐
本主题聚焦于如何使用Java实现10个线程按照顺序打印数字1到100。这种问题通常通过线程间通信和同步机制来解决,如`synchronized`关键字、`wait()`、`notify()`或`notifyAll()`方法,以及`Semaphore`、`CyclicBarrier...
在这个编程问题中,我们需要实现一个程序来处理一个正整数,按照特定的规则生成一系列新的整数,并将它们按升序排列输出。这个问题涉及到的主要知识点包括C++编程、一维数组的操作、冒泡排序算法以及输入输出的处理...
在主程序中,同样创建了10个线程,但这些线程共享同一个`R`对象,因此它们共享同一个`x`变量,从而按顺序输出了从1到10的数字。 ```java R r = new R(); for (int i = 0; i ; i++) { Thread t = new Thread(r); t...
8. **协程**:Lua提供了轻量级的并发模型——协程(coroutine),它们不是线程,而是允许在一个线程内实现多个并发执行流。 9. **XVM API**:XVM(eXtended Visualization Mod)是World of Tanks的一个扩展插件,它...
在C语言中实现数字雨,通常是指在控制台模拟一种动态效果,即数字依次从屏幕顶部向下滚动,形成类似雨水落下的视觉体验。这是一种常见的编程练习,有助于学习者熟悉字符输出、循环结构、定时器以及多线程等基础知识...
在传统单线程应用程序中,处理多个图片裁剪任务时,每个图片的裁剪操作需要依次执行,这导致了处理速度的低下,尤其是当图片数量较多时,等待时间会变得格外漫长。而多线程技术的出现,成功解决了这一瓶颈。通过并行...
这导致线程在执行过程中出现短暂的暂停,使得输出的数字之间有间隔,而不是连续快速地打印。 ```java class ThreadA extends Thread { public ThreadA(String name) { super(name); } public synchronized ...
在上述代码示例中,创建了一个`Barrier`实例,设置参与者数量为3,然后启动3个线程,每个线程都调用`SignalAndWait()`,依次打印数字0到4。由于`Barrier`的作用,所有线程都会在打印完一组数字后同时进入下一组,...
这个PHP脚本会依次输出数字0到9,并且每个数字之间间隔10秒,这样做的目的是为了模拟一个耗时较长的任务。 然后,我们编写一个shell脚本来并行执行这个PHP脚本: ```bash #!/bin/bash for i in {1..10} do /usr/...
该算法的基本思想是:从2开始,依次将每个素数的倍数标记为合数,最后剩下的未被标记的数就是素数。 二、Java实现素数筛 1. 初始化数组 首先,我们需要创建一个boolean类型的数组,长度为n+1,所有元素初始化为true...
数据依次输入74HC595,当所有数据加载完成后,通过RCK的上升沿将数据并行输出,点亮对应的LED。 5. **系统设计方案**: - 硬件框架包括上位机、下位机、LED点阵及74HC595驱动芯片。 - PA和PB口作为数据输出,连接...
18. **线程共享资源**:在同一进程中,线程可以共享数据段和文件描述符,但每个线程有自己的栈和寄存器集。 19. **构造函数的执行顺序**:在派生类中,构造函数的执行顺序是基类构造函数先执行,然后是派生类的构造...
这个游戏中,实际的实现可能需要更复杂的逻辑,例如网络通信来同步玩家的状态和操作,这超出了单个Java程序的范畴,可能需要使用多线程、网络编程等高级概念。 通过这两个小游戏,我们可以学习到Java的基本语法、...
2. 数字引脚的输入/输出控制:`noTone()`和`tone()`函数。 3. 延时控制:`delay()`函数。 4. 音频信号生成:通过定时器在数字引脚上生成方波模拟音调。 5. 多线程概念:在循环中顺序播放不同引脚的音调。 这些知识...
* 顺序结构:程序从上到下依次执行 * 选择结构:if 语句、switch 语句 * 循环结构:for 语句、while 语句、do-while 语句 四、Java 函数 * Java 中的函数可以重载和重写 * 函数的声明格式为:返回类型 函数名...
而埃拉托斯特尼筛法则是一种更有效的筛选方法,通过依次剔除已知素数的倍数,可以找出一定范围内的所有素数。 在MATLAB源程序中,可能包含以下几个关键部分: 1. **输入处理**:程序会接收用户输入的数字范围,...
6. 未提供具体程序,但根据题目描述,输出应为 1 2 3,表示程序在循环或序列中依次打印了这三个数字。 7. Response.Write("新浪") 会输出 "新浪",其中引号内的内容会被当作字符串输出,不会自动转换为超链接。答案...