cpp_pthread - 8BitsCoding/RobotMentor GitHub Wiki

threadmutex

์ฐธ๊ณ , ๊ฐœ๋ฐœํ™˜๊ฒฝ์€ ๋ฆฌ๋ˆ…์Šค์—์„œ ์‹คํ–‰ํ•ด์„œ pthread๋ฅผ ์‚ฌ์šฉํ•จ


  • ๊ถ๊ธˆํ–ˆ๋˜ ์ ์ด mutex์˜ ๋ฐฉ์–ด? ๋ฒ”์œ„๊ฐ€ ์–ด๋””๊นŒ์ง€์ธ์ง€๊ฐ€ ๊ถ๊ธˆํ–ˆ์Œ -> ๊ฒฐ๋ก ์€ mutex๊ฐ€ ์„ ์–ธ๋œ ์ธ์Šคํ„ด์Šค๊นŒ์ง€ ๋ฐฉ์–ด๋ฒ”์œ„๊ฐ€ ๋œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐ

#include <pthread.h>
#include <unistd.h>

class B;

class A{
public:
  //pthread_t p;
  int thr_id;
  int count = 0;
  B* b;
  void setB(B* _b) {b = _b;}
  pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  // mutex๊ฐ€ A์— ์„ ์–ธ๋˜์—ˆ๊ธฐ์— A์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€๋งŒ ๋ฐฉ์–ด๊ฐ€ ๋œ๋‹ค.

  void startThr() {
    //thr_id = pthread_create(&p, NULL, &A::threadA, (void*)&thr_id);
  }


};

class B{
public:
  //pthread_t p;
  int thr_id;
  int count = 0;
  A* a;
  void setA(A* _a) {a = _a;}
  pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

  void startThr() {
    //thr_id = pthread_create(&p, NULL, &B::threadB, (void*)&thr_id));
  }

};

void* threadA(void* p){
  B* b = (B*)p;
  while(1)
  {
    pthread_mutex_lock(&(b->mutex));    // 2๋ฒˆ ํ˜ธ์ถœ๋˜๋ฉด unlock ํ˜ธ์ถœ ์‹œ ๊นŒ์ง€ ์—ฌ๊ธฐ์„œ ๋Œ€๊ธฐ
    // ์—ฌ๊ธฐ๊ฐ€ ์ œ์ผ ์ค‘์š”ํ•œ๋ฐ, ์ด๊ฒŒ ๋ฌด์Šจ๋ง์ด๋ƒ๊ณ  ํ•˜๋ฉด mutex lock์ด ๊ฑธ๋ ค์žˆ๋Š” ๋™์•ˆ B ์ธ์Šคํ„ด์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์€ ํ˜„์žฌ ์Šค๋ ˆ๋“œ ๋ฐ–์— ์—†๋‹ค๋Š” ์ .
    // ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ(ํ˜น์€ ์ž๊ธฐ ์ž์‹ ์ด๋ผ๋„) ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์—†๊ณ  ๋Œ€๊ธฐํ•ด ์žˆ๊ฒŒ ๋œ๋‹ค.
    printf("A : %d\n", (b->a->count)++);
    //b->a->count++;
    sleep(2);
    pthread_mutex_unlock(&(b->mutex));
  }
}


void* threadB(void* p){
  B* b = (B*)p;

  while(1)
  {
    //pthread_mutex_lock(&(b->mutex));
    printf("threadB to a : %d\n", (b->a->count)++);
    sleep(1);
    //pthread_mutex_unlock(&(b->mutex));
  }

}

int main(int argc, char **argv)
{
  A* a = new A;
  B* b = new B;
  a->setB(b);
  b->setA(a);
  pthread_t p[2];
  a->thr_id = pthread_create(&p[0], NULL, threadA, (void*)a);
  b->thr_id = pthread_create(&p[1], NULL, threadB, (void*)b);

์ถ”๊ฐ€. ๋‹ค์Œ์ƒํ™ฉ์€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

threadA์—์„œ B๋ฅผ mutex lock๊ฑธ์–ด๋ฒ„๋ฆฌ๊ณ  threadB์—์„œ B์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•œ๋‹ค.

-> ์ •๋‹ต์€ ์ ‘๊ทผ์ด ๋œ๋‹ค. ๋งค์šฐ ์œ„ํ—˜ํ•˜๊ฒ ์ง€?? -> ๊ฒฐ๋ก )) mutex๋ฅผ ์ •๋ง ์ž˜ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.!!!

void* threadA(void* p){
  B* b = (B*)p;
  while(1)
  {
    pthread_mutex_lock(&(b->mutex));    // 2๋ฒˆ ํ˜ธ์ถœ๋˜๋ฉด unlock ํ˜ธ์ถœ ์‹œ ๊นŒ์ง€ ์—ฌ๊ธฐ์„œ ๋Œ€๊ธฐ
    printf("A : %d\n", (b->count)++);
    sleep(2);
    //pthread_mutex_unlock(&(b->mutex));
  }
}


void* threadB(void* p){
  B* b = (B*)p;

  while(1)
  {
    //pthread_mutex_lock(&(b->mutex));
    printf("threadB to b : %d\n", (b->count)++);
    sleep(1);
    //pthread_mutex_unlock(&(b->mutex));
  }

}

pthread

Linux

์“ฐ๋ ˆ๋“œ ํ•จ์ˆ˜ ์ƒ์„ฑ

#include <pthread.h>

// ์“ฐ๋ ˆ๋“œ ํ•จ์ˆ˜
void *t_function(void * data) {
    int id;
    int i = 0;
    id = *((int*)data);

    while(1)
    {
        printf("%d : %d\n", id, i);
        i++;
        sleep(1);
    }
}

์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ(pthread_create, pthread_join)

// ์“ฐ๋ ˆ๋“œ ์‚ฌ์šฉ
int main() {
    pthread_t p_thread[2];
    int thr_id;
    int status;
    int a = 1;
    int b = 2;

    // ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ ํ›„ ์•„๊ทœ๋จผํŠธ๋ฅผ 1๋กœ ๋„˜๊ธด๋‹ค.
    thr_id = pthread_create(&p_thread[0], NULL, t_function, (void*)&a);

    if(thr_id < 0)
    {
        perror("thread create error : ");
        exit(0);
    }

    // ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ ํ›„ ์•„๊ทœ๋จผํŠธ๋ฅผ 2๋กœ ๋„˜๊ธด๋‹ค.
    thr_id = pthread_create(&p_thread[1], NULL, t_function, (void*)&b);

    if(thr_id < 0)
    {
        perror("thread create error : ");
        exit(0);
    }

    // ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. (๋„ฃ์ง€ ์•Š์„ ์‹œ Main ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋จผ์ € ์ข…๋ฃŒ๋˜๊ธฐ์— ํ…Œ์ŠคํŒ…์ด ๋ถˆ๊ฐ€๋Šฅ!)
    pthread_join(p_thread[0], (void**)&status);
    pthread_join(p_thread[1], (void**)&status);

    // (์ฐธ๊ณ ) pthread_join์— ๋Œ€ํ•œ ์„ค๋ช… : join์„ ํ•  ์‹œ ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ ๋ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๋ผ์ธ์œผ๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š์Œ
    /*
    pthread_join(p_thread[0], (void**)&status);
    printf("End Thread \n");
    */
    // p_thread[0]์ด ์ข…๋ฃŒ๋˜๊ณ  ๋‚˜์„œ printf๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

    return 0;
}

์“ฐ๋ ˆ๋“œ ๋ถ„๋ฆฌ (pthread_detach)

pthread_detach(p_thread[0]);
// main ์“ฐ๋ ˆ๋“œ์—์„œ p_thread[0]์„ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์—†๊ฒŒ๋œ๋‹ค.
// ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ์ผ์ด ์—†๋‹ค๊ณ  ๋ณด๋ฉด๋จ.

Critical Section(mutex_lock, mutex_unlock)

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

int ncount;    // ์“ฐ๋ ˆ๋“œ๊ฐ„ ๊ณต์œ ๋˜๋Š” ์ž์›
pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER; // ์“ฐ๋ ˆ๋“œ ์ดˆ๊ธฐํ™”

// ์“ฐ๋ ˆ๋“œ ํ•จ ์ˆ˜ 1
void* do_loop(void *data)
{
    int i;

    pthread_mutex_lock(&mutex); // ์ž ๊ธˆ์„ ์ƒ์„ฑํ•œ๋‹ค.
    for (i = 0; i < 10; i++)
    {
        printf("loop1 : %d", ncount);
        ncount ++;
        sleep(1);
    }
    pthread_mutex_unlock(&mutex); // ์ž ๊ธˆ์„ ํ•ด์ œํ•œ๋‹ค.
}

// ์“ฐ๋ ˆ๋“œ ํ•จ์ˆ˜ 2
void* do_loop2(void *data)
{
    int i;

    // ์ž ๊ธˆ์„ ์–ป์œผ๋ ค๊ณ  ํ•˜์ง€๋งŒ do_loop ์—์„œ ์ด๋ฏธ ์ž ๊ธˆ์„ 
    // ์–ป์—ˆ์Œ์œผ๋กœ ์ž ๊ธˆ์ด ํ•ด์ œ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.  
    pthread_mutex_lock(&mutex); // ์ž ๊ธˆ์„ ์ƒ์„ฑํ•œ๋‹ค.
    for (i = 0; i < 10; i++)
    {
        printf("loop2 : %d", ncount);
        ncount ++;
        sleep(1);
    }
    pthread_mutex_unlock(&mutex); // ์ž ๊ธˆ์„ ํ•ด์ œํ•œ๋‹ค.
}    
	
int main()
{
    int thr_id;
    pthread_t p_thread[2];
    int status;
    int a = 1;

    ncount = 0;
    thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a);
    sleep(1);
    thr_id = pthread_create(&p_thread[1], NULL, do_loop2, (void *)&a);

    pthread_join(p_thread[0], (void *) &status);
    pthread_join(p_thread[1], (void *) &status);

    status = pthread_mutex_destroy(&mutex);
    printf("code  =  %d", status);
    printf("programing is end");
    return 0;
}

Windows

์†Œ์Šค์ฝ”๋“œ

  1. http://ww.sourceware.org/pthreads-win32 ์— ๋“ค์–ด๊ฐ€์„œ pthread lib, include, dll์„ ๋‹ค์šด ๋ฐ›๋Š”๋‹ค.
  2. 'prebuilt-dll-2-9-1'์„ ์ถ”์ „
  3. ํ”„๋กœ์ ํŠธ์˜ C/C++ -> ์ผ๋ฐ˜ -> ์ถ”๊ฐ€์ข…์†์„ฑ -> include๋ฅผ ์ถ”๊ฐ€
  4. ํ”„๋กœ์ ํŠธ์˜ ๋ง์ปค -> ์ผ๋ฐ˜ -> ์ถ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -> lib\x##์„ ์ถ”๊ฐ€
  5. ํ”„๋กœ์ ํŠธ์˜ ๋ง์ปค -> ์ž…๋ ฅ -> ์ถ”๊ฐ€ ์ข…์†์„ฑ -> lib\x##์˜ lib๋ฅผ ์ถ”๊ฐ€
  6. Windows\SysWOW64์— dll์„ ์ถ”๊ฐ€

์ฐธ๊ณ ์‚ฌ์ดํŠธ
์ฐธ๊ณ ์‚ฌ์ดํŠธ2
Windowsํ™˜๊ฒฝ pthread์‚ฌ์šฉ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ