Paul Chen 2006-03-16 BeiJing
//以下代码均来自《Linux C 编程》一书,本人对其中代码做了一些改进,使之更有利于系统学习GNU C标准库中Pthread。
//特别注意:makefile中的编译选项中一定要包含-lpthread(即连接pthread库)
makefile:
demo:demo1.o
gcc -o demo demo1.o -lpthread
demo1.o:demo1.c
gcc -c demo1.c
clean:
rm demo demo1.c
demo1.c:
#include <stdio.h>
#include <pthread.h>
//used in test1
pthread_once_t once=PTHREAD_ONCE_INIT;
//used in test2
pthread_mutex_t mutex;
pthread_cond_t cond;
//used in test3
pthread_key_t key;
void once_run(void)
{
printf("once_run in thread %d\n",pthread_self());
}
void * child1(void *arg)
{
int tid=pthread_self();
printf("thread child1 %d enter\n",tid);
pthread_once(&once,once_run);
//sleep(3);
printf("thread child1 %d returns\n",tid);
}
void * child2(void *arg)
{
int tid=pthread_self();
printf("thread child2 %d enter\n",tid);
pthread_once(&once,once_run);
//sleep(3);
printf("thread child2 %d returns\n",tid);
}
void * child3(void *arg)
{
pthread_cleanup_push(pthread_mutex_unlock,&mutex); /* comment 1 */
while(1){
printf("thread child3 get running \n");
printf("thread child3 pthread_mutex_lock returns %d\n",
pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
printf("thread child3 condition applied\n");
pthread_mutex_unlock(&mutex);
sleep(5);
}
pthread_cleanup_pop(0); /* comment 2 */
}
void *child4(void *arg)
{
while(1){
sleep(3); /* comment 3 */
printf("thread child4 get running.\n");
printf("thread child4 pthread_mutex_lock returns %d\n",
pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
printf("thread child4 condition applied\n");
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
void echomsg(int t)
{
printf("destructor excuted in thread %d,param=%d\n",pthread_self(),t);
}
void * child5(void *arg)
{
int tid=pthread_self();
printf("thread child5 %d enter\n",tid);
pthread_setspecific(key,(void *)tid);
sleep(2);
printf("thread child5 %d returns %d\n",tid,pthread_getspecific(key));
sleep(5);
}
void * child6(void *arg)
{
int tid=pthread_self();
printf("thread child6 %d enter\n",tid);
pthread_setspecific(key,(void *)tid);
sleep(1);
printf("thread child6 %d returns %d\n",tid,pthread_getspecific(key));
sleep(5);
}
int main(void)
{
int tid1,tid2,tid3,tid4,tid5,tid6;
printf("hello\n");
printf("\n\n\n");
//test1:pthread_once,pthread_self
pthread_create(&tid1,NULL,child1,NULL);
pthread_create(&tid2,NULL,child2,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
printf("\n\n\n");
//test3:pthread_key_create,pthread_setspecific,pthread_getspecific
pthread_key_create(&key,echomsg);
pthread_create(&tid5,NULL,child5,NULL);
pthread_create(&tid6,NULL,child6,NULL);
pthread_join(tid5,NULL);
pthread_join(tid6,NULL);
pthread_key_delete(key);
printf("\n\n\n");
//test2:pthread_mutex_lock,pthread_mutex_unlock,pthread_cond_wait,pthread_cleanup_pop pthread_cond_signal,pthread_exit
pthread_create(&tid3,NULL,child3,NULL);
pthread_create(&tid4,NULL,child4,NULL);
pthread_join(tid3,NULL);
pthread_join(tid4,NULL);
do{
sleep(2); /* comment 4 */
pthread_cancel(tid3); /* comment 5 */
sleep(2); /* comment 6 */
pthread_cond_signal(&cond);
}while(1);
sleep(100);
pthread_exit(0);
printf("\n\n\n");
printf("main thread exit\n");
return 0;
}