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: -->トイレを出ました!

-- お疲れ様でした。。。


戻る
inserted by FC2 system