软件测试必要性不言而喻。对于用信号量实现进程互斥的测试,分两步走:

  • 先测试没有加锁的情况,出现了逻辑错误
  • 加上锁,看问题是否消失

模拟多个对象同时操作,如生产者-消费者问题,多个生产者,多个消费者。需要创建多个线程来模拟操作,详情见多线程编程

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
本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2023-04-27 17:17

results matching ""

    No results matching ""