::: 강좌/소스/문서 :::

강좌/소스/문서 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-17 01:51:59, Hit : 4324, Vote : 1191
 [Thread] pthread_cond_signal() function

/***************************************************
*--------------------------------------------------
*   Creat  : 2001. 04. 10  (programed by Cori-Young )
*   Site: http://www.byoneself.co.kr
*   Update :
*--------------------------------------------------
*   Compile : cc -o xxx xxx.c -lpthread -lrt
*--------------------------------------------------
* Machine hardware:   sun4u
* OS version:         5.7
* Processor type:     sparc
* Hardware:           SUNW,Ultra-60
***************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>

#define _MULTI_THREADED
#define NTHREADS      2

static void checkResults(char *string, int rc) {

  if (rc) {

    printf("Error on : %s, rc=%d", string, rc);
    exit(EXIT_FAILURE);
  }
  return;
}

int                 workToDo = 0;

pthread_cond_t      cond  = PTHREAD_COND_INITIALIZER;
pthread_mutex_t     mutex = PTHREAD_MUTEX_INITIALIZER;

void *threadfunc(void *parm)
{

  int           rc;

  while (1) {

    /* Usually worker threads will loop on these operations */

    rc = pthread_mutex_lock(&mutex);
    checkResults("pthread_mutex_lock()n", rc);


    while (!workToDo) {

      printf("Thread blockedn");

      rc = pthread_cond_wait(&cond, &mutex);
      checkResults("pthread_cond_wait()n", rc);

    }

    printf("Thread awake, finish work!n");
    /* Under protection of the lock, complete or remove the work     */
    /* from whatever worker queue we have. Here its simply a flag    */

    workToDo = 0;

    rc = pthread_mutex_unlock(&mutex);
    checkResults("pthread_mutex_lock()n", rc);
  }
  return NULL;
}


int main(int argc, char **argv)
{

  int                   rc=0;
  int                   i;

  pthread_t             threadid[NTHREADS];

  printf("Enter Testcase - %sn", argv[0]);
  printf("Create %d threadsn", NTHREADS);

  for(i=0; i<NTHREADS; ++i) {
    rc = pthread_create(&threadid[i], NULL, threadfunc, NULL);
    checkResults("pthread_create()n", rc);
  }

  sleep(5);  /* Sleep isn't a very robust way to serialize threads */

  for(i=0; i<5; ++i) {

    printf("Wake up a worker, work to do...n");

    rc = pthread_mutex_lock(&mutex);
    checkResults("pthread_mutex_lock()n", rc);

    /* In the real world, all the threads might be busy, and       */
    /* we would add work to a queue instead of simply using a flag */
    /* In that case the boolean predicate might be some boolean    */
    /* statement like: if (the-queue-contains-work)                */

    if (workToDo) {

       printf("Work already present, likely threads are busyn");
    }

    workToDo = 1;

    rc = pthread_cond_signal(&cond);
    checkResults("pthread_cond_broadcast()n", rc);

    rc = pthread_mutex_unlock(&mutex);
    checkResults("pthread_mutex_unlock()n", rc);

    sleep(5);  /* Sleep isn't a very robust way to serialize threads */

  }
  printf("Main completedn");
  exit(0);
  return 0;
}





43   [Unix/Linux] [Thread] pthread_equal() function  김영대 2003/03/17 4831 1371
42   [Unix/Linux] [Thread] pthread_detach() function  김영대 2003/03/17 5247 1422
41   [Unix/Linux] [Thread] pthread_create() function  김영대 2003/03/17 5098 1351
40   [Unix/Linux] [Thread] pthread_cond_wait() function  김영대 2003/03/17 4827 1322
39   [Unix/Linux] [Thread] pthread_cond_timedwait() function  김영대 2003/03/17 6023 1783
  [Unix/Linux] [Thread] pthread_cond_signal() function  김영대 2003/03/17 4324 1191
37   [Unix/Linux] [Thread] pthread_cond_init() function  김영대 2003/03/17 5535 1514
36   [Unix/Linux] [Thread] pthread_cond_destroy() function  김영대 2003/03/17 4672 1243
35   [Unix/Linux] [Thread] pthread_cond_broadcast() function  김영대 2003/03/17 4800 1390
34   [Unix/Linux] [Thread] pthread_condattr_destroy() function  김영대 2003/03/17 4660 1348
33   [Unix/Linux] [Thread] pthread_cond() function  김영대 2003/03/17 6127 1625
32   [Unix/Linux] [Thread] pthread_cleanup_push() function  김영대 2003/03/17 4996 1445
31   [Unix/Linux] [Thread] pthread_cleanup_pop() function  김영대 2003/03/17 5002 1479
30   [Unix/Linux] [Thread] pthread_cancel() function  김영대 2003/03/17 5945 1697
29   [Unix/Linux] [Thread] pthread_attr_setinheritsched() function  김영대 2003/03/17 5174 1455
28   [Unix/Linux] [Thread] pthread_attr_setdetachstate() function  김영대 2003/03/17 5394 1537
27   [Unix/Linux] [Thread] pthread_attr_init() function  김영대 2003/03/17 4853 1382
26   [Unix/Linux] [Thread] pthread_attr_getschedparam() function  김영대 2003/03/17 4994 1413
25   [Unix/Linux] [Thread] pthread_attr_getinheritsched() function  김영대 2003/03/17 5041 1558
24   [Unix/Linux] [Thread] pthread_attr_getdetachstate() function  김영대 2003/03/17 5104 1490

[1][2][3][4][5][6][7] 8 [9][10]
 

Copyright 1999-2020 Zeroboard / skin by zero