標準輸出也可以是一個共享資源

Muten發表於2020-10-15

目錄

 

1.目標需求

2.分析

3.不符合要求的程式碼

4.符合要求的程式碼

5.觀察與思考

6.說明


1.目標需求

想要主執行緒和子執行緒分別完整列印出HELLOWORLD和helloword,每個執行緒都要分兩次列印,不能一起列印。實現這個需求。

2.分析

標準輸出對於兩個執行緒來說也是共享資源,需要加上對共享資源的保護。這裡需要實現的是執行緒間的同步。

3.不符合要求的程式碼

#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
void *tnf(void *arg)
{
  srand(time(NULL));
  while(1)
  {
   printf("hello");
   sleep(rand()%3);
   printf("world\n");
   sleep(rand()%3);
  }
  return NULL;
}

int main()
{
  pthread_t tid;
  srand(time(NULL));
  pthread_create(&tid,NULL,tnf,NULL);
    
  while(1)
  {
   printf("HELLO");
   sleep(rand()%3);
   printf("WORLD\n");
   sleep(rand()%3);
  }
  return 0;
}

4.符合要求的程式碼

#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
pthread_mutex_t mutex;
void *tnf(void *arg)
{
  srand(time(NULL));
  while(1)
  {
   pthread_mutex_lock(&mutex);
   printf("hello");
   sleep(rand()%3);
   printf("world\n");
   pthread_mutex_unlock(&mutex);
   sleep(rand()%3);
  }
  return NULL;
}

int main()
{
  pthread_t tid;
  srand(time(NULL));
  pthread_create(&tid,NULL,tnf,NULL);
    
  while(1)
  {
   pthread_mutex_lock(&mutex);
   printf("HELLO");
   sleep(rand()%3);
   printf("WORLD\n");
   pthread_mutex_unlock(&mutex);
   sleep(rand()%3);
  }
  pthread_mutex_destroy(&mutex);
  return 0;
}

5.觀察與思考

以下程式碼,與上一份程式碼作比較,結合列印現象思考關於鎖的粒度與CPU被奪走的可能性:

#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
pthread_mutex_t mutex;


void *tnf(void *arg)
{
  srand(time(NULL));
  while(1)
  {
   pthread_mutex_lock(&mutex);
   printf("hello");
   sleep(rand()%3);
   printf("world\n");
   sleep(rand()%3);
   pthread_mutex_unlock(&mutex);
  }
  return NULL;
}

int main()
{
  pthread_t tid;
  srand(time(NULL));
  pthread_create(&tid,NULL,tnf,NULL);
    
  while(1)
  {
   pthread_mutex_lock(&mutex);
   printf("HELLO");
   sleep(rand()%3);
   printf("WORLD\n");
   sleep(rand()%3);
   pthread_mutex_unlock(&mutex);
  }
  pthread_mutex_destroy(&mutex);
  return 0;
}

6.說明

在訪問貢獻資源前加鎖,訪問結束後立即解鎖,一般來說,在滿足需求的情況下,鎖的粒度越小越好。

相關文章