- 论坛徽章:
- 0
|
很简单的情况,创建两个线程,第2个去cancel第1个。
但如果 f1 中的 localtime_r 和 sem 同时打开执行, f2 在 join时阻塞;
如果只开任何一个, f2 的join 成功。
困惑中,请高手指点! (redhat 8.0)
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <time.h>
#define LEN 128
#define PATH "./"
pthread_t tid[2];
char filename[LEN];
FILE *f;
void *f1(void *p)
{
pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
printf( "in %s\n", __FUNCTION__ );
time_t ta;
struct tm tb;
ta = time( NULL );
#if 1
localtime_r( &ta, &tb );
#else
memset( &tb, 0, sizeof(tb) );
#endif
snprintf( filename, LEN, "%s%d_%d_%d-%d_%d.data",
PATH,
tb.tm_year + 1900, tb.tm_mon, tb.tm_mday,
tb.tm_hour, tb.tm_min);
printf( "Backup file is %s\n", filename);
f = fopen( filename, "w" );
if( ! f)
perror( "ERROR: OpenBackup" );
#if 1
sem_t sem;
sem_init( &sem, 0, 0);
sem_wait( &sem );
#else
sleep(1000);
#endif
}
void *f2(void *p)
{
pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
printf( "in %s\n", __FUNCTION__ );
pthread_cancel( tid[0] );
printf( "f2: join ...\n");
pthread_join( tid[0], NULL);
printf( "f2: join ok !\n" );
}
int main()
{
pthread_attr_t tattr;
pthread_attr_init( &tattr);
pthread_attr_setdetachstate( &tattr, PTHREAD_CREATE_JOINABLE);
pthread_create( &tid[0], &tattr, f1, NULL);
sleep(5);
pthread_create( &tid[1], &tattr, f2, NULL);
printf( "press ...\n" );
getchar();
}
[ 本帖最后由 andyY 于 2006-2-8 11:31 编辑 ] |
|