ThreadとSemaphore
戻る
#include <semaphore.h>
#include <pthread.h>
#include <errno.h>
#define NUM_TOILETS 5
#define NUM_MEMBERS 10
/**
* $Id: semaphore.html,v 1.1 2009/06/22 16:12:25 kishi Exp kishi $
*/
typedef struct
{
pthread_t id;
int member_id;
}
thread_data;
sem_t semaphore;
void
do_as_nature_calls (void)
{
sleep (4); /* 用足しに必要な時間 */
}
void *
member_thread (void *p)
{
thread_data *td = p;
struct timespec abs_time;
abs_time.tv_sec = time (NULL) + 3;
abs_time.tv_nsec = 0;
printf ("%d: これから用を足したいと思いマース!\n", td->member_id);
if (0 == sem_timedwait (&semaphore, &abs_time)) {
printf (" %d: <--トイレに入りました!\n", td->member_id);
do_as_nature_calls ();
printf (" %d: -->トイレを出ました!\n", td->member_id);
sem_post (&semaphore);
}
else {
printf ("/*** %d: もう我慢できません・・・よって諦めます(TT)***/ \n",
td->member_id);
}
return 0;
}
int
main (void)
{
int i;
thread_data data[NUM_MEMBERS];
sem_init (&semaphore, 0, NUM_TOILETS);
for (i = 0; i < NUM_MEMBERS; i++) {
data[i].member_id = i;
if (pthread_create (&data[i].id, 0, member_thread, &data[i]) != 0) {
printf ("スレッドを生成できませんでした: %d.\n", errno);
}
}
for (i = 0; i < NUM_MEMBERS; i++) {
if (0 != pthread_join (data[i].id, 0)) {
printf ("Cannot join thread %d: %d.\n", i, errno);
}
}
printf ("\n-- お疲れ様でした。。。\n");
sem_destroy (&semaphore);
return 0;
}
■実行例
$ ./Sample1.exe
0: これから用を足したいと思いマース!
0: <--トイレに入りました!
1: これから用を足したいと思いマース!
1: <--トイレに入りました!
2: これから用を足したいと思いマース!
2: <--トイレに入りました!
3: これから用を足したいと思いマース!
3: <--トイレに入りました!
4: これから用を足したいと思いマース!
4: <--トイレに入りました!
5: これから用を足したいと思いマース!
6: これから用を足したいと思いマース!
7: これから用を足したいと思いマース!
8: これから用を足したいと思いマース!
9: これから用を足したいと思いマース!
/*** 9: もう我慢できません・・・よって諦めます(TT)***/
/*** 8: もう我慢できません・・・よって諦めます(TT)***/
/*** 7: もう我慢できません・・・よって諦めます(TT)***/
/*** 6: もう我慢できません・・・よって諦めます(TT)***/
/*** 5: もう我慢できません・・・よって諦めます(TT)***/
0: -->トイレを出ました!
1: -->トイレを出ました!
2: -->トイレを出ました!
3: -->トイレを出ました!
4: -->トイレを出ました!
-- お疲れ様でした。。。
戻る