📄 step.c
字号:
/* step.c for step.exp */#include <ipc.h>#include <pthread.h>#include <st.h>#include <signal.h>#include <stdio.h>void alarm_handler ();void alarm_handler1 ();void alarm_handler2 ();void thread1 ();void thread2 ();#define TIME_LIMIT 30int count1 = 0;int count2 = 0;pthread_t tid1, tid2;pthread_attr_t attr1, attr2;pthread_mutex_t mut;pthread_mutexattr_t mut_attr;pthread_condattr_t cv_attr_a, cv_attr_b;pthread_cond_t cv_a, cv_b;struct cv_struct { char a; char b; }test_struct;main (){ /*init la struct */ test_struct.a = 0; test_struct.b = 1; /* create le mutex */ if (pthread_mutexattr_create (&mut_attr) == -1) { perror ("mutexattr_create"); exit (1); } if (pthread_mutex_init (&mut, mut_attr) == -1) { perror ("mutex_init"); exit (1); } /* create 2 cv */ if (pthread_condattr_create (&cv_attr_a) == -1) { perror ("condattr_create(1)"); exit (1); } if (pthread_cond_init (&cv_a, cv_attr_a) == -1) { perror ("cond_init(1)"); exit (1); } if (pthread_condattr_create (&cv_attr_b) == -1) { perror ("condattr_create(2)"); exit (1); } if (pthread_cond_init (&cv_b, cv_attr_b) == -1) { perror ("cond_init(2)"); exit (1); } /* create 2 threads of execution */ if (pthread_attr_create (&attr1) == -1) { perror ("attr_create(1)"); exit (1); } if (pthread_create (&tid1, attr1, thread1, &count1) == -1) { perror ("pthread_create(1)"); exit (1); } if (pthread_attr_create (&attr2) == -1) { perror ("attr_create(2)"); exit (1); } if (pthread_create (&tid2, attr2, thread2, &count2) == -1) { perror ("pthread_create(2)"); exit (1); } /* set alarm to print out data and exit */ signal (SIGALRM, alarm_handler); alarm (TIME_LIMIT); for (;;) pause ();}void thread1 (count) int *count;{ tid_t tid; tid = getstid (); printf ("Thread1 tid 0x%x (%d) \n", tid, tid); printf ("Thread1 @tid=0x%x \n", &tid); signal (SIGALRM, alarm_handler1); for (;;) { if (pthread_mutex_lock (&mut) == -1) { perror ("pthread_mutex_lock(1)"); pthread_exit ((void *) 0); } while (test_struct.a == 0) { if (pthread_cond_wait (&cv_a, &mut) == -1) { perror ("pthread_cond_wait(1)"); pthread_exit ((void *) -1); } } (*count)++; printf ("*******thread1 count %d\n", *count); test_struct.a = 0; test_struct.b = 1; pthread_cond_signal (&cv_b); if (pthread_mutex_unlock (&mut) == -1) { perror ("pthread_mutex_unlock(1)"); pthread_exit ((void *) -1); } }}void thread2 (count) int *count;{ tid_t tid; tid = getstid (); printf ("Thread2 tid 0x%x (%d) \n", tid, tid); printf ("Thread1 @tid=0x%x \n", &tid); signal (SIGALRM, alarm_handler2); for (;;) { if (pthread_mutex_lock (&mut) == -1) { perror ("pthread_mutex_lock(2)"); pthread_exit ((void *) 0); } while (test_struct.b == 0) { if (pthread_cond_wait (&cv_b, &mut) == -1) { perror ("pthread_cond_wait(2)"); pthread_exit ((void *) -1); } } (*count)++; printf ("*******thread2 count %d\n", *count); test_struct.b = 0; test_struct.a = 1; pthread_cond_signal (&cv_a); if (pthread_mutex_unlock (&mut) == -1) { perror ("pthread_mutex_unlock(2)"); pthread_exit ((void *) -1); } }}void alarm_handler (){ printf ("\tcount1 (%d) \n\tcount2 (%d)\n", count1, count2); exit (0);}void alarm_handler1 (){ printf ("ALARM thread 1\n");}void alarm_handler2 (){ printf ("ALARM thread 2\n"); pthread_exit ((void *) 0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -