使用线程同步顺序打印数字

在这里,我们将看到如何使用不同的线程以正确的顺序打印数字。在这里,我们将创建n个线程,然后对其进行同步。这个想法是,第一个线程将打印1,然后第二个线程将打印2,依此类推。当一个线程尝试打印时,它将锁定资源,因此没有线程可以使用该部分。

示例

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t* cond = NULL;

int threads;

volatile int count = 0;

void* sync_thread(void* num) { //this function is used to synchronize the threads

   int thread_number = *(int*)num;

   while (1) {

      pthread_mutex_lock(&mutex); //lock the section

      if (thread_number != count) { //if the thread number is not same as count, put all thread

          except one into waiting state

         pthread_cond_wait(&cond[thread_number], &mutex);

      }

      printf("%d ", thread_number + 1); //print the thread number

         count = (count+1)%(threads);

      //通知下一个线程

      pthread_cond_signal(&cond[count]);

      pthread_mutex_unlock(&mutex);

   }

   return NULL;

}

int main() {

   pthread_t* thread_id;

   volatile int i;

   int* thread_arr;

   printf("\nEnter number of threads: ");

      scanf("%d", &threads);

   //将内存分配给cond(条件变量)线程ID和大小线程数组

   cond = (pthread_cond_t*)malloc(sizeof(pthread_cond_t) * threads);

   thread_id = (pthread_t*)malloc(sizeof(pthread_t) * threads);

   thread_arr = (int*)malloc(sizeof(int) * threads);

   for (i = 0; i < threads; i++) { //create threads

      thread_arr[i] = i;

      pthread_create(&thread_id[i], NULL, sync_thread, (void*)&thread_arr[i]);

   }

   //等待线程

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

      pthread_join(thread_id[i], NULL);

   }

   return 0;

}

输出结果

$ g++ test.cpp -lpthread

$ ./a.out

Enter number of threads: 5

1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3

4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3

4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1

2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4

5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2

3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

...

...

...

以上是 使用线程同步顺序打印数字 的全部内容, 来源链接: utcz.com/z/334999.html

回到顶部