⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_thread.cpp

📁 Unix/Linux多线程编程
💻 CPP
字号:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>

//取得当前时间
char* getCurDate( char* _str )
{
    time_t  now_t = time( NULL );
    struct  tm  *pTm = localtime( &now_t );
   

    //输出日期类型为YYYY-MM-DD HH:MI:SS
    sprintf( _str, "%4d-%02d-%02d %02d:%02d:%02d",
            pTm->tm_year + 1900, pTm->tm_mon + 1, pTm->tm_mday,
            pTm->tm_hour, pTm->tm_min, pTm->tm_sec);

    return _str;
}
//线程暂停
void ThreadSleep( unsigned int sec )
{
    struct timespec delay;
    delay.tv_sec = sec;
    delay.tv_nsec = 0;
    pthread_delay_np( &delay );
}
//线程主函数
void * ThreadFunc( void * argv )
{
    int sec = *(int*)argv;
    const char* filename = "test.ini";
    char datebuf[20] = "";
    pthread_t pid = pthread_self();   

    printf(" --[%s][%d][sec:%d ] thread start...\n", getCurDate(datebuf), pid, sec );
    
    while( 1 )
    {
        FILE * fp = fopen( filename, "rb" );
        if ( !fp )
        {
            printf( " --[%s][%d]open file( %s ) failed.\n", getCurDate(datebuf),pid, filename );
            break;
        }
        int status = 0;
        fscanf( fp, "%d", &status );
        fclose( fp );

        if ( 1 == status )
            break;

        ThreadSleep(1);
        printf( " --[%d] sleep...\n", pid );

    }
    
    printf( " --[%s][%d]Sleep %d second to exit.\n", getCurDate(datebuf),pid, sec );
    
    ThreadSleep( sec );
    printf( " --[%s][%d] thread exit!\n", getCurDate(datebuf), pid);
    return (void*)&pid;
}

//创建线程
int ThreadCreate(pthread_t& pid, int sec )
{
    printf(" --sec: %d\n", sec );
    int nSec = sec;
    char datebuf[20] = "";
    pthread_attr_t   attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    
    if (pthread_create(&pid, &attr, ThreadFunc, &nSec ) != 0)
    {
        printf(" --[%s]Thread create faile!!![ sec:%d ]\n", getCurDate(datebuf),sec );
        return -1;
    }
    return 100;
}
//测试一
void test_1()
{
    pthread_t id1 = 0;
    pthread_t id2 = 0;
    pthread_t id3 = 0;
    pthread_t id4 = 0;
    
    void * status1 = NULL;
    void * status2 = NULL;
    void * status3 = NULL;
    void * status4 = NULL;
    char datebuf[20] = "";
    printf("$ [%s] Begin to create threads ...\n", getCurDate( datebuf));
    
    int sec1 = 20;
    int sec2 = 10;
    int sec3 = 15;
    int sec4 = 5;
    int ret1 = ThreadCreate( id1, sec1 );
    int ret2 = ThreadCreate( id2, sec2 );
    int ret3 = ThreadCreate( id3, sec3 );
    int ret4 = ThreadCreate( id4, sec4 );
    printf("$ [%s]ThreadCreat() Return: [1]%d, [2]%d, [3]%d, [4]%d\n", 
        getCurDate(datebuf), ret1, ret2, ret3, ret4 );
    printf("$ [%s]ThreadId: [1]%d, [2]%d, [3]%d, [4]%d\n", 
        getCurDate(datebuf), id1, id2, id3, id4 );
    
    sleep( 20 );
    ret1 = pthread_cancel( id1 ); //取消线程
    ret2 = pthread_cancel( id2 );
    //ret3 = pthread_cancel( id3 );
    //ret4 = pthread_cancel( id4 );
    printf("$ [%s]pthread_cancel() Return: [1]%d, [2]%d, [3]%d, [4]%d\n", 
        getCurDate(datebuf), ret1, ret2, ret3, ret4 );
    
    ret1 = pthread_join( id1, &status1 ); //等待结束
    ret2 = pthread_join( id2, &status2 );
    ret3 = pthread_join( id3, &status3 );
    ret4 = pthread_join( id4, &status4 );
    
    printf("$ [%s]pthread_join() Return: [1]%d, [2]%d, [3]%d, [4]%d\n", 
        getCurDate(datebuf),ret1, ret2, ret3, ret4 );
    //printf("$ Status: [1]%d, [2]%d, [3]%d, [4]%d\n", 
    //    *(int*)status1, *(int*)status2, *(int*)status3, *(int*)status4 );

    //return 0;
}
//测试二
void test_2()
{
    //初始化线程属性
    const int NUM = 5;
    size_t StackSize = 2048*1024;
    
    pthread_t  thrid[NUM];
    pthread_attr_t attr[NUM];
    char datebuf[20] = "";
    
    printf("$ [%s] Begin to initialize threads ...\n", getCurDate( datebuf));
    for( int i = 0; i < NUM; i++ )
    {
        pthread_attr_init( &attr[i] );
        pthread_attr_setdetachstate( &attr[i], PTHREAD_CREATE_JOINABLE);
        pthread_attr_setstacksize( &attr[i],   StackSize);
    }
    
    //-----------------------------------
    //创建线程
    printf("$ [%s] Begin to create threads ...\n", getCurDate( datebuf));
    int ret = 0;
    int i = 0;    
    for( i = 0; i < NUM; i++ )
    {
        int sec = (i+1)*3;
        if (pthread_create(&thrid[i], &attr[i], ThreadFunc, &sec) != 0)
        {
            printf("$ Thread create faile!!!\n");
        }
        else
        {
            printf("$ Thread create success!!!\n");
        }
    }
    //监控文件的状态------------------
    const char* filename = "test.ini";
    while( 1 )
    {
        FILE * fp = fopen( filename, "rb" );
        if ( !fp )
        {
            printf( "$ --[%s] open file( %s ) failed.\n", getCurDate(datebuf), filename );
            break;
        }
        int status = 0;
        fscanf( fp, "%d", &status );
        fclose( fp );

        if ( 1 == status )
            break;

        ThreadSleep(1);
    }
    //-----------------------------------
    printf("$ [%s] Begin to cancel threads ...\n", getCurDate( datebuf));
    ret = pthread_cancel( thrid[3] ); //取消WorkerDay  线程
    printf("$ [%s] cancel threads, return %d.\n", getCurDate( datebuf), ret);
    
    //-----------------------------------
    printf("$ [%s] Begin to join threads ...\n", getCurDate( datebuf));
    void * status[NUM];
    for( int k = 0; k < i; k++ )
    {
        ret = pthread_join( thrid[k], &status[k] );
        printf("$ pthread_join [%d], return %d, status %d\n", k, ret, *((int*)status) );
    }
    
    //-----------------------------------
    printf("$ [%s] Begin to destroy thread attributes ...\n", getCurDate( datebuf));    
    for( int k = 0; k < NUM; k++ )
    {
        ret = pthread_attr_destroy( &attr[k] );
        printf("$ pthread_attr_destroy [%d], return %d\n", k, ret );
    }
    
    //-----------------------------------
    printf("$ [%s] %s exit\n", getCurDate( datebuf), __FUNCTION__);
}

int main( int argc, char** argv )
{
    test_2();
    
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -