找回密码
 立即注册
首页 业界区 安全 利用信号量实现线程顺序执行

利用信号量实现线程顺序执行

勺缓曜 2025-6-7 09:34:20
线程顺序循环执行的场景在多线程编程中并不罕见,尤其是在需要协调多个线程按特定顺序重复执行任务的情况下。以下是几个常见的例子:

  • 生产者-消费者模型:在这种模型中,生产者线程生成数据并将其放入缓冲区,而消费者线程从缓冲区取出数据进行处理。这种情况下,生产者和消费者线程通常按顺序交替运行。
  • 流水线处理:在某些应用中,数据处理分为多个步骤,每个步骤由不同的线程负责。例如,在图像处理流水线中,可能有一个线程读取图像数据,一个线程处理图像,一个线程保存处理后的图像。每个线程按顺序操作,形成一个循环处理流水线。
  • 周期性任务调度:某些系统需要周期性地执行一组任务,例如传感器数据采集系统,每个传感器的数据采集线程需要按顺序运行,并且在一定时间后重新开始。
为了更好地理解,我们可以通过一个具体的例子来说明如何使用信号量和多线程实现顺序循环执行。
利用POSIX无名信号量实现三个线程 T1、T2 和 T3,按顺序循环执行各自的任务。
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <semaphore.h>
  4. #include <unistd.h>
  5. #define NUM_ITERATIONS 3
  6. sem_t sem1, sem2, sem3;
  7. void* thread1(void* arg) {
  8.     for (int i = 0; i < NUM_ITERATIONS; ++i) {
  9.         sem_wait(&sem1);  // 等待信号量
  10.         printf("Thread 1 is running\n");
  11.         sleep(1);  // 模拟工作
  12.         printf("Thread 1 has finished\n");
  13.         sem_post(&sem2);  // 通知thread2可以开始
  14.     }
  15.     return NULL;
  16. }
  17. void* thread2(void* arg) {
  18.     for (int i = 0; i < NUM_ITERATIONS; ++i) {
  19.         sem_wait(&sem2);  // 等待信号量
  20.         printf("Thread 2 is running\n");
  21.         sleep(1);  // 模拟工作
  22.         printf("Thread 2 has finished\n");
  23.         sem_post(&sem3);  // 通知thread3可以开始
  24.     }
  25.     return NULL;
  26. }
  27. void* thread3(void* arg) {
  28.     for (int i = 0; i < NUM_ITERATIONS; ++i) {
  29.         sem_wait(&sem3);  // 等待信号量
  30.         printf("Thread 3 is running\n");
  31.         sleep(1);  // 模拟工作
  32.         printf("Thread 3 has finished\n");
  33.         sem_post(&sem1);  // 通知thread1可以开始
  34.     }
  35.     return NULL;
  36. }
  37. int main() {
  38.     pthread_t t1, t2, t3;
  39.     // 初始化信号量
  40.     sem_init(&sem1, 0, 1);  // 初始信号量为1,使线程1首先运行
  41.     sem_init(&sem2, 0, 0);
  42.     sem_init(&sem3, 0, 0);
  43. /*
  44. int sem_init(sem_t *sem, int pshared, unsigned int value);
  45. pshared信号量的作用范围,0为线程间,非0为进程间
  46. value 信号量值,首先执行的线程信号量设置为1,其他的为0
  47. */
  48.     // 创建线程
  49.     pthread_create(&t1, NULL, thread1, NULL);
  50.     pthread_create(&t2, NULL, thread2, NULL);
  51.     pthread_create(&t3, NULL, thread3, NULL);
  52.     // 等待所有线程完成
  53.     pthread_join(t1, NULL);
  54.     pthread_join(t2, NULL);
  55.     pthread_join(t3, NULL);
  56.     // 销毁信号量
  57.     sem_destroy(&sem1);
  58.     sem_destroy(&sem2);
  59.     sem_destroy(&sem3);
  60.     printf("All threads have finished execution.\n");
  61.     return 0;
  62. }
复制代码
输出结果:
  1. Thread 1 is running
  2. Thread 1 has finished
  3. Thread 2 is running
  4. Thread 2 has finished
  5. Thread 3 is running
  6. Thread 3 has finished
  7. Thread 1 is running
  8. Thread 1 has finished
  9. Thread 2 is running
  10. Thread 2 has finished
  11. Thread 3 is running
  12. Thread 3 has finished
  13. Thread 1 is running
  14. Thread 1 has finished
  15. Thread 2 is running
  16. ...
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册