So implementieren Sie die Linux-Multithread-Programmierung

WBOY
Freigeben: 2023-05-19 10:19:05
nach vorne
1238 Leute haben es durchsucht

Einführung
Bedingungsvariablen sind ein Mechanismus, der von Threads gemeinsam genutzte globale Variablen zur Synchronisierung verwendet. Er umfasst hauptsächlich zwei Aktionen: Ein Thread wartet auf die Einrichtung der Bedingungsvariablen und bleibt hängen (zu diesem Zeitpunkt ist sie nicht mehr belegt). die CPU) ); ein anderer Thread macht die Bedingung wahr (gibt ein Signal, dass die Bedingung wahr ist). Um Konflikte zu vermeiden, wird die Verwendung von Bedingungsvariablen immer mit einer Mutex-Sperre kombiniert.

Funktionsprototyp
1. Bedingungsvariablen definieren

#include <pthread.h>

/* 定义两个条件变量 */
pthread_cond_t cond_pro, cond_con;
Nach dem Login kopieren

2. Bedingungsvariablen initialisieren und zerstören

#include <pthread.h>

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);int pthread_cond_destroy(pthread_cond_t *cond); /* 初始化条件变量 */
pthread_cond_init(&cond_pro, null);
pthread_cond_init(&cond_con, null);
/* 销毁条件变量 */
pthread_cond_destroy(&cond_pro);
pthread_cond_destroy(&cond_pro);
Nach dem Login kopieren

3

#include <pthread.h>

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);
/* 等待条件 */
/* 注意:pthread_cond_wait为阻塞函数。解开锁,再等待。等条件满足时,需要抢到锁,才可以被唤醒*/  
pthread_cond_wait(&cond_pro,&mutex); 

/* 激发条件 */
/* 所有因为不满足条件的线程都会阻塞在条件变量cond_pro中的一个队列中 */
/* 以广播方式,通知所有被阻塞的所有线程 */
pthread_cond_broadcast(&cond_pro);
/* 以signal方式,只通知排在最前面的线程 */
pthread_cond_signal(&cond_pro);
Nach dem Login kopieren

Code

/*************************************************************************
  > file name: my_con.c
  > author: krischou
  > mail:zhoujx0219@163.com 
  > created time: tue 26 aug 2014 10:24:29 am cst
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#define cell 10
#define flore 0

 

int i = 0; /* 所有线程共享的全局变量,此处假定至多递增至10,最小减到0 */

pthread_mutex_t mutex;       /* 定义互斥锁 */
pthread_cond_t cond_pro, cond_con; /* 定义两个条件变量 */

/* 生产者线程 */
void* pro_handler(void *arg)
{
  pthread_detach(pthread_self());  /* 由系统回收线程资源,而非主线程回收资源 ,此类情况主线程是个服务器,永久不会退出 */
  
  while(1)
  {
    pthread_mutex_lock(&mutex);
    while(i >= cell)
    {
      pthread_cond_wait(&cond_pro,&mutex); 
      /* continue是轮询,此处是阻塞 */
      /* 把锁放开再等 ,第一个参数是结构体指针,其中有成员存放被阻塞的函数 */
      /*不占cpu*/
      /* 不满足条件时才会等 ,需要别人告诉它,才能唤醒它*//* 当它返回时,锁也要回来了*/
    }
    i++;
    if(i == 1)
    {
      /* 由空到不空,唤醒消费者 */
      pthread_cond_signal(&cond_con);  /*不会立马signal被阻塞的消费者线程,因为其还要等锁抢回来*/
    }
    printf("add i: %d \n", i);
    pthread_mutex_unlock(&mutex);
    sleep(rand() % 5 + 1);
  }
}

/* 消费者线程 */
void* con_handler(void *arg)
{
  pthread_detach(pthread_self());
  while(1)
  {
    pthread_mutex_lock(&mutex);
    while(i <= flore)
    {
      pthread_cond_wait(&cond_cno,&mutex);
    }
    i--;
    if(i == 9) /* 由满到不满,要告诉生产者,以便将其唤醒 *//*此处,直接signal也可以,我们是为了更加精确*/
    {
      pthread_cond_signal(&cond_pro);
    }
    printf("con i: %d \n", i);
    pthread_mutex_unlock(&mutex);
    sleep(rand() % 5 + 1);
  }
}

int main(int argc, char *argv[]) // exe +num -num
{
  srand(getpid());
  int con_cnt, pro_cnt;
  pro_cnt = atoi(argv[1]);
  con_cnt = atoi(argv[2]);
  pthread_mutex_init(&mutex,null);
  pthread_cond_init(&cond_pro,null);
  pthread_cond_init(&cond_con,null);
  pthread_t *arr = (pthread_t*)calloc(con_cnt + pro_cnt , sizeof(pthread_t));
  int index = 0;
  while(pro_cnt > 0)
  {
    pthread_create(arr + index, null, pro_handler, null);
    index++;
    pro_cnt--;
  }
  while(con_cnt > 0)
  {
    pthread_create(arr + index, null, con_handler, null);
    index++;
    con_cnt--;
  }
  while(1);
  pthread_mutex_destroy(&mutex);
  pthread_cond_destroy(&cond_pro);
  pthread_cond_destroy(&cond_con);
  return 0;
}
Nach dem Login kopieren

Hinweis
Ob im Producer-Thread oder im Consumer-Thread. Die gelb markierte Beurteilungsbedingung muss while verwenden. Am Beispiel des Producer-Threads wird zu diesem Zeitpunkt pthread_cond_wait(&cond_cno,&mutex); ausgeführt, wenn i>=cell, also i voll ist. Muss warten, bis der Consumer-Thread pthread_cond_signal(&cond_pro); aufwacht. Es reicht jedoch nicht aus, dass der Verbraucher dies signalisiert. Der angehaltene Produzenten-Thread muss die Sperre erneut erhalten, bevor er aktiviert werden kann. Da der Produzent die Sperre jedoch nicht sofort ergreifen kann, wenn der Verbraucher ein Signal sendet, kann sich der i-Wert zu diesem Zeitpunkt auf größer oder gleich 10 ändern. Daher müssen Sie while verwenden. Andernfalls kann es zu i>10 kommen.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Linux-Multithread-Programmierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!