多线程的sleep,静态链接

来源:互联网 发布:画k线图软件 编辑:程序博客网 时间:2024/06/05 11:58

利用pthread库做多线程编程,如果使用简单的sleep系统调用,如果对pthread的实现不是很清楚的话,或者linux内核的sleep系统调用和pthread库配合的不是很好的话,在线程里面进行sleep系统调用的话,可能导致所有的线程休眠。或者在main函数里面调用sleep,在特定版本的linux内核中可能导致程序所有线程都休眠。这可能是不希望的,所以可以用异步IO实现“安全”的线程休眠。具体用select实现即可:

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

int mySleep(unsigned int sleepSecond)
{
    struct timeval t_timeval;
    t_timeval.tv_sec = sleepSecond;
    t_timeval.tv_usec = 0;
    select( 0, NULL, NULL, NULL, &t_timeval );
    return 0;
}


    这就可以绕过可能的“陷阱”。

    在嵌入式应用里面,除去通用的库,出于空间的考虑,需要把一些程序进行静态链接,如果在实现sleep这个程序的时候,使用这个mySleep调用。进行静态链接的时候会产生出很大的可执行程序。

    例如:

int main(int argc,char ** argv)
{
    if(argc ==2)
    {
        int secNumber=0;
        secNumber=atoi(argv[1]);
        mySleep(secNumber);
    }
    else
    {

        printf("Usage:%s  <second number>/n",argv[0]);
    }
    return 0;
}

   
    进行:g++ -o sleep --static sleep.cpp
    得到的sleep可执行程序超过了1M。

    而使用传统的sleep系统调用编制sleep程序,在控制程序大小方面更好:

int main(int argc,char ** argv)
{
    if(argc == 2)
    {
        sleep(atoi(argv[1]));
    }
    else
    {
        printf("Usage:%s <sec Number>/n",argv[0]);
    }
    return 0;
}


    进行:gcc -o sleep --static sleep.c
    得到的sleep可执行程序仅仅400K左右。

    很好。