Lv4. ¾²·¹µå ¼ø¼­ Áö۱â
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

¹®Á¦

Thread1, Thread2, Thread3, Thread4 ÀÌ·¸°Ô 4°³ÀÇ ¾²·¹µå°¡ ÀÖ´Ù. À̶§ Thread1->Thread2->Thread3->Thread4->Thread1->Thread2... ÀÌ·±½ÄÀ¸·Î ¼ø¼­´ë·Î ¾²·¹µå°¡ ÀÛµ¿µÇµµ·Ï ÇØº¸ÀÚ.

´ÙÀ½ÀÇ Á¶°ÇÀ» ¸¸Á·½ÃÄÑ¾ß ÇÑ´Ù.
  1. C/C++ ·Î ÀÛ¼º
  2. ¹Ù»Û´ë±â »óÅ¿¡ ³õÀÌ¸é ¾ÈµÈ´Ù.

¾òÀ» ¼ö ÀÖ´Â °Í

  • ¾²·¹µå »ç¿ë
  • ¾²·¹µå Á¦¾î¿Í µ¿±â¸¦ À§ÇÑ Mutex¿Í Á¶°Çº¯¼ö ÀÀ¿ë


Âü°í¹®¼­

  1. Thread À§Å°
  2. message queue

¸Þ½ÃÁöÅ¥ ±¸Çö

  • message typeÀ» ÀÌ¿ëÇÑ ±¸Çö
#include <pthread.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <sys/stat.h> 
#include <regex.h> 
 
#include <fcntl.h> 
#include <string.h> 
 
#define ThreadNum 4 
 
pthread_mutex_t mutex_lock; 
pthread_cond_t  sync_cond; 
 
pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t  gcond  = PTHREAD_COND_INITIALIZER; 
 
struct Data 
{ 
  int msgtype; 
  int id; 
  char data[8]; 
  key_t key_id; 
}; 
 
void *Tfunction(void *data) 
{ 
  struct Data lData; 
  int myid; 
 
  lData = *(struct Data *)data; 
 
  // ¾²·¹µå µ¿±âÈ­ 
  pthread_mutex_lock(&mutex_lock); 
  usleep(1000); 
  pthread_cond_signal(&sync_cond); 
  pthread_mutex_unlock(&mutex_lock); 
 
  myid = lData.id; 
  while(1) 
  { 
    if(msgrcv(lData.key_id, (void *)&lData, sizeof(lData), lData.id, 0) == -1) 
    { 
      perror("msgrcv thread error: "); 
    } 
    if (myid < ThreadNum) 
    { 
      lData.msgtype = myid+1; 
    } 
    else 
    { 
      lData.msgtype = 1; 
    } 
    lData.id = myid; 
    if(msgsnd(lData.key_id, (void *)&lData, sizeof(lData), IPC_NOWAIT) <0) 
    { 
      perror("msg snd error"); 
      exit(0); 
    } 
    printf("Thread Num %d\n", myid); 
    usleep(100); 
  } 
} 
 
int main(int argc, char **argv) 
{ 
  struct Data lData; 
 
  pthread_t p_thread[ThreadNum]; 
 
  // Message queue 
  key_t key_id; 
 
  // ¸Þ½ÃÁöÅ¥ »ý¼º 
  key_id = msgget((key_t)8888, IPC_CREAT|0666); 
  if (key_id == -1) 
  { 
    perror("msgget error : "); 
    exit(0); 
  } 
 
  for (int i = 0; i < ThreadNum; i++) 
  { 
    lData.msgtype = i+1; 
    lData.id = i+1; 
    lData.key_id = key_id; 
 
    printf("Create Thread %d\n", lData.id); 
    pthread_mutex_lock(&mutex_lock); 
    pthread_create(&p_thread[i], NULL, Tfunction, (void *)&lData); 
    pthread_cond_wait(&sync_cond, &mutex_lock); 
    pthread_mutex_unlock(&mutex_lock); 
  } 
  lData.msgtype = 1; 
  if(msgsnd(key_id, (void *)&lData, sizeof(lData), IPC_NOWAIT) <0) 
  { 
    perror("msg main snd error"); 
    exit(0); 
  } 
  while(1) 
  { 
    sleep(1); 
  } 
} 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.