软件测试必要性不言而喻。对于用信号量实现进程互斥的测试,分两步走:
- 先测试没有加锁的情况,出现了逻辑错误
- 加上锁,看问题是否消失
模拟多个对象同时操作,如生产者-消费者问题,多个生产者,多个消费者。需要创建多个线程来模拟操作,详情见多线程编程 。
1. 创建多个线程Segmentation fault
创建多个线程模拟多个对象操作,
pthread_t thread_id[NUM_THREADS];
for (int i=0; i<NUM_THREADS; i++){
int retval = pthread_create(&thread_id[i], NULL, do_something, &i);
if (0 != retval){
perror("pthread_create error.");
}
}
然而,当线程数目很大时(比如60000),就会报错Segmentation fault (core dumped)
,如果打印出pthread_create
的返回值,在i=32750
时(这个值不固定),返回值为11
,意为Cannot allocate memory
或者Resource temporarily unavailable
。在创建线程时,系统没有足够的内存资源分配。
查看操作系统允许的最大线程数,打开文件/proc/sys/kernel/threads-max
,以我为例,值为60902
。按理说,上述32750
还没达到60902
,值得注意的下,要考虑到系统中还有其他已创建的线程。
除此之外,线程函数如果执行很少的内容,也很难达到多线程互斥访问,因为指令少,在还没有发生调度的时候,就执行完了。
可以让线程睡上几秒,让线程间有机会实现互斥访问。
2. 让进程/线程进入睡眠状态
sleep(3) - Linux manual page,让调用者睡眠一段时间,单位为秒。
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
进程或者线程调用sleep
,调用者进入睡眠状态,更确切地说,是Interruptible Sleep。调用者在以下两种情况,进入到就绪态:
- 睡眠时间到
- 信号到来,并且该信号不可忽略
3. 其他
用ulimit
命令查看和设置系统的一些变量,
# ulimit -all
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 30451
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 30451
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited