📄 test_thread.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 + -