阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
来源:互联网 发布:酷派大神f2网络切换 编辑:程序博客网 时间:2024/05/23 16:45
[置顶] 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
目录(?)[+]
引言:题目具体描述记不大清了,大概是:Linux平台,利用线程调度的随机性和sleep的不准确性,生成一个各位均不相同的字符数组的伪随机序列。不得使用任何库函数。(这句记得清楚,当时在想线程库算不算,题目的意思应该是:不得使用库提供的随机函数)
1.算法
当时读完题很开心,这题可以用与“《编程珠玑》取样问题(ch12, p119)”类似的算法解决。算法如下——除了第一字符(下标0)以外,为其余N-1个字符各创建一个线程,每个线程先sleep一秒(也可以更长),再将对应位置的字符和第一个字符交换;N-1个线程完成后,主线程结束。原理暗藏在题目中,sleep一秒后,因为sleep的不准确性,这N-1个线程几乎同时醒来(就绪)(试想如若sleep非常精确,各个线程醒来的顺序就会和创建顺序相同);又由于线程调度的随机性,这时会被执行的线程是随机的,(不知先后顺序地)执行N-1次之前所述的交换所得的便是一个伪随机序列。不过当时想不起来pthread_create几个参数的顺序了(前面题的计算量不小,头都搞晕了),就随便按个顺序写了。回来后,按照当时的思路很快在电脑上写了出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
来自CODE的代码片err_rand_str.c
2.互斥
不过一在电脑上写出来立即意识到一个问题——第一个元素是临界资源(所有“其他线程”都想抢着用这块地);如果不做互斥访问可能会出现——有的字符出现两次(获更多)有的字符没了,这种错误不是每次都会出现:意识到这个错误之后,比较容易修改,只需将线程函数内对第一个元素的操作放入临界区中即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
来自CODE的代码片err2_rand_str.c
这次不会再有错误。for命令连续测试10次:
到此,说明这个算法没有问题。
3.同步
还应该main里的sleeep(2)改掉。main创建好N-1个线程后就应该被挂起,直到其他所有线程都“完工”后才应该被唤醒;肯定要用条件变量,main创建好其他线程后wait阻塞,其他所有线程都“完工”再被signal唤醒。为了保证这样的顺序,必须要让最后一个完工的线程知道自己是最后一个,也就是在最后一个其他线程“收工”的时候signal。只需要加个计数变量count用来标记还有多少线程没有完工,将其初始化为要创建的线程数N-1,每有一个线程“完工”就count--,判断count的值即可知道当前线程是倒数第几个完工的。(啰嗦一堆,还是上代码直观):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
来自CODE的代码片rand_str.c
注:本机环境gcc 4.6.1(MinGW)
- 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
- 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
- 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
- 利用thread和sleep生成字符串的伪随机序列
- 利用thread和sleep生成字符串的伪随机序列
- (阿里笔试)使用多线程和sleep函数生成字符串的伪随机排列
- 使用多线程和sleep函数生成字符串的伪随机排列(阿里巴巴2014武汉站一道题)
- [阿里2015校招笔试]求字符串query和text最长连续字母序列的长度
- 使用多线程和sleep函数生成字符串的伪随机排列
- 字符串尾序列(阿里笔试题)
- 阿里2014校招笔试题
- 阿里校招笔试题
- 利用线程的随机调度特性和sleep库函数的低精度实现字符的伪随机排序
- 阿里校招笔试
- 阿里校招笔试——给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成,并输出解。
- 【2014校招】阿里研发笔试
- 【2014校招】阿里 summer intern笔试
- 2014年阿里校招笔试题目
- sc命令行添加windows服务
- 一个网友分享的成长经历
- 模块加载时 insmod “Invalid module format ”问题解决
- 本文写给广大正在做软件开发的、曾经做过软件开发的以及即将做软件开发的女同胞们。同时也希望男同胞们能够给女同胞多一些理解和包容,多一些关心和帮助,让女同胞能在软件开发的路上走的更远一点,走的更好一
- 静态 static 关键字用法
- 阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
- String s=new String("abc")创建了几个对象?
- Linux设备驱动程序学习(1) -字符设备驱动程序
- linux如何清除.svn目录
- CentOS 5.7 将系统语言更换为中文简体
- 黑马程序员----泛形
- java中的MessageDigest类
- Linux设备驱动程序学习(2)-调试技术(补充)
- Java web 项目中文件的下载