void *pp(void *)
{
printf(\"ha ha\");
alarm(1);
}
void main_alarm(int i)
{
printf(\"Main got\\n\");
alarm(3);
}
main()
{
pthread_t pid;
struct sigaction aa;
sigset_t sigt;
sigfillset(&sigt);
aa.sa_handler = mainalarm;
aa.sa_mask = sigt;
aa.sa_flags = 0;
sigaction(SIGALRM, &aa, NULL);
pthread_create(&pid, NULL, pp, NULL);
while(1);
return 0;
}
七. 放弃 (Cancellation)
-----------------------
这是一种机制: 一个线程可以结束另一个线程. 精确的说, 一个线程可以
向另一个线程发送 cancellation 请求. 另一个线程根据其设置, 可以忽
略掉该请求, 也可以在到达一个cancellation点时, 来处理它.
当一个线程处理一个cancellaction请求时, pthread_exit 一个一个的调
用 cleanup handlers. 所谓的一个cancellation点是在这些地方, 线程会
处理cancellation请求. POSIX中的函数: pthread_join
pthread_cond_wait pthread_cond_timewait pthread_testcancel sem_wait
sigwait 都是cancellation点. 下面的这些系统函数也是cancellation点:
accept open sendmsg
close pause sendto
connect read system
fcntl recv tcdrain
fsync recvfrom wait
lseek recvmsg waitpid
msync send write
nanosleep
其它的一些函数如果调用了上面的函数, 那么, 它们也是cancellation点.
int pthread_setcancelstate (int STATE, int *OLDSTATE);
用于允许或禁止处理cancellation,
STATE可以是:PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_DISABLE
int pthread_setcanceltype (int TYPE, int *OLDTYPE);
设置如何处理cancellation, 异步的还是推迟的.
TYPE可以是:PTHREAD_CANCEL_ASYNCHRONOUS PTHREAD_CANCEL_DEFERRED
void pthread_testcancel (VOID);
八. 清理函数 (Cleanup Handlers)
-------------------------------
这是一些函数, 它们会被pthread_exit按顺序调用. 它们以栈风格被管理.
这种机制的目的是希望在退出前释放掉一些占用的资源.
例如: 我们使用了一个MUTEX, 但希望在cancellation时能unlock它.
pthread_cleanup_push(pthread_mutex_unlock, (void *)&mut);
pthread_mutex_lock(&mut);
/* do some work */
pthread_mutex_unlock(&mut);
pthread_cleanip_pop(0);
注意:
在异步处理过程中, 一个cancellation可以发生在pthread_cleaup_push
和pthread_mutex_lock之间. 这中情况是很糟糕的. 所以, 异步的cancellation
是很难用的.
void pthread_cleanup_push (void (*ROUTINE) (void *), void *ARG);
void pthread_cleanup_pop (int EXECUTE);
如果EXECUTE不等于0, 则在出栈后, 会被执行一次.
九. 信号量 (Semaphores)
-----------------------
Semaphores是线程间共享的资源计数器.
基本的信号量操作为: 原子的增加信号量, 原子的减少信号量, 等待直到
信号量的值为非零.
在POSIX中, 信号量有一个最大值, 宏SEM_VALUE_MAX定义了该值. 在GNU
的LIBC中, 该值等于INT_MAX (太大了).
下面是相关的函数:
int sem_init (sem_t *SEM, int PSHARED, unsigned int VALUE);
初始化一个信号量, 其值为VALUE, PSHARED指明它是不是共享的.
0 表示local, 非0表示是全局的.
int sem_destroy (sem_t * SEM);
释放掉相关的资源.
int sem_wait (sem_t * SEM);
等待直到SEM的值为非零.
int sem_trywait (sem_t * SEM);
int sem_post (sem_t * SEM);
将信号量加1.
int sem_getvalue (sem_t * SEM, int * SVAL);
取得信号量的值.
--------------------------------------------------------------------------------
[home][Gnu][Gnu Documents][Linux][Linux Documents][About us]
发布人:netbull 来自:Bricks with GNU&LINU