`
gstarwd
  • 浏览: 1525107 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

pthread库学习(2): 线程的同步,使用信号量

阅读更多
先看下面这段程序,主线程创建了三个线程,每个线程中均有一个打印语句。

#include <stdio.h>

#include <pthread.h>

#include <semaphore.h>

 void *thread_a(void *in)

{

printf("I am thread_a\n");

pthread_exit((void *)0);

}

 

void *thread_b(void *in)

{

printf("I am thread_b\n");

pthread_exit((void *)0);

}

 

void *thread_c(void *in)

{

    printf("I am thread_c\n");

pthread_exit((void *)0);

}

 

int main()

{

    pthread_t a,b,c;  /* thread id a, b, c*/

    int val;         /* used for function return result */

 

    /* create thread a, b, c */

    pthread_create(&a, NULL, thread_a, (void *)0);

    pthread_create(&b, NULL, thread_b, (void *)0);

    pthread_create(&c, NULL, thread_c, (void *)0);

 

    /* main thread waits for termination of a,b,c */

    pthread_join(a, (void **)0);

    pthread_join(b, (void **)0);

    pthread_join(c, (void **)0);

 

    printf("Main thread is over\n");

    return 0;

}
在Linux下进行编译: gcc -o My_Thread My_Thread.c ./MyThread
得到的输出:
 I am thread_a
I am thread_b
I am thread_c
Main thread is over

现在我们希望线程C的最先打印,然后线程B打印,最后线程A打印。即三个线程之间的打印有一定的先后关系。看下面程序:

#include <stdio.h>

#include <pthread.h>

#include <semaphore.h>

sem_t sem1;

sem_t sem2;

void *thread_a(void *in)

{

    sem_wait(&sem1);       /* wait for sem1 */

    printf("I am thread_a\n");

    pthread_exit((void *)0);

}

 

void *thread_b(void *in)

{

    sem_wait(&sem2);       /* wait for sem2 */

    printf("I am thread_b\n");

    sem_post(&sem1);       /* increase sem1 by 1, make thread_a run*/

    pthread_exit((void *)0);

}

 

void *thread_c(void *in)

{

    printf("I am thread_c\n");

    sem_post(&sem2);      /* increase sem2 by 1, make thread_b run*/

    pthread_exit((void *)0);

}

 

int main()

{

    pthread_t a,b,c;  /* thread id a, b, c*/

    int val;         /* used for function return result */

 

    /* init sem1 sem2 to 0 , any thread waits for it will be blocked*/

    sem_init(&sem1, 0, 0);

sem_init(&sem2, 0, 0);

   

/* create thread a, b, c */

pthread_create(&a, NULL, thread_a, (void *)0);

pthread_create(&b, NULL, thread_b, (void *)0);

pthread_create(&c, NULL, thread_c, (void *)0);

 

    /* main thread waits for termination of a,b,c */

    pthread_join(a, (void **)0);

    pthread_join(b, (void **)0);

    pthread_join(c, (void **)0);

 

    /* destroy sem1 sem2 */

    sem_destroy(&sem1);

    sem_destroy(&sem2);

 

    printf("Main thread is over\n");

    return 0;

}

gcc -o My_thread1 My_thread1.c -lpthread
./My_thread1
I am thread_c
I am thread_b
I am thread_a
Main thread is over

可以见到,线程的执行顺序已经改变。
 
分享到:
评论

相关推荐

    Windows可使用的pthread库

    2. **线程同步**:pthread库提供了多种同步机制,包括互斥锁(`pthread_mutex_t`)、条件变量(`pthread_cond_t`)、信号量(`pthread_semaphore_t`)和读写锁(`pthread_rwlock_t`)。这些同步原语有助于防止数据...

    windows下可用的pthread库

    - 使用pthread_mutex_t进行线程同步,保护共享资源 - 使用pthread_cond_t实现线程间的条件等待和通知 5. **注意事项** - Windows与Linux的线程模型有差异,移植时需注意线程局部存储(TLS)的实现方式。 - ...

    重大软院操作系统实验三:线程同步

    为避免这种情况,线程同步机制如锁、信号量、条件变量、事件、管程等被广泛使用。 1. **互斥锁**:互斥锁是最基本的线程同步机制,它保证了同一时间只有一个线程可以访问临界区(包含共享资源的代码段)。在Linux中...

    pthread线程库源代码

    在学习pthread库时,理解线程的生命周期、调度策略、上下文切换以及如何正确使用各种同步机制(如锁和信号量)至关重要。此外,还需注意线程安全问题,比如避免数据竞争、死锁和优先级反转等。通过深入学习pthread源...

    pthread多线程c++动库下载

    pthread是POSIX线程库,它为C++编程...合理地使用锁(mutex)、信号量、条件变量等同步机制是至关重要的。同时,了解pthread的线程生命周期管理、线程局部存储(TLS)以及取消点等特性也是编写高效多线程代码的基础。

    windows下使用pthread库

    - **线程同步**:pthread库提供了多种同步机制,如互斥量(`pthread_mutex_t`)、条件变量(`pthread_cond_t`)、信号量(`sem_t`)等。这些在Windows下也能正常工作,但需要注意,Windows的同步原语(如Mutex、...

    pthread GNU的一个线程库

    rwlock_t`和`pthread_rwlock_rdlock()`, `pthread_rwlock_wrlock()`, `pthread_rwlock_unlock()`)以及上述提到的信号量(`sem_t`和`sem_init()`, `sem_wait()`, `sem_post()`)等,这些同步原语用于保证线程安全,...

    Pthread多线程编程指南

    《Pthread多线程编程指南》是一本专为开发者准备的深入解析Pthread线程库的手册,尤其适合那些在UNIX、Linux等操作系统环境中进行多线程编程的工程师。Pthread,全称POSIX线程(Portable Operating System Interface...

    Linux系统编程-(pthread)线程通信(信号量).pdf

    【Linux系统编程——pthread线程通信(信号量)】 在多线程编程中,线程间的通信和同步是至关重要的,以确保数据的一致性和程序的正确运行。在这个主题中,我们将深入探讨一种用于线程同步的机制——信号量。信号量在...

    线程同步(信号量,互斥,条件变量)

    线程同步是解决这一问题的关键技术,主要包括互斥量、信号量和条件变量。 **互斥量(Mutex)**是一种基本的线程同步机制,用于保护共享资源免受并发访问的影响。在上述例子中,如果多个线程同时访问并修改全局链表...

    pthread 在windows下的库,可以配合vs2017使用,有教程和测试程序

    线程间的通信和同步是多线程编程中的核心,而pthread库为此提供了丰富的API,如线程创建、线程退出、信号量、读写锁等,这些都是实现并发程序高效运行的关键工具。 总之,这个压缩包为Windows开发者提供了一种在VS...

    Pthread创建一个线程

    6. **线程同步与通信**:Pthread还提供了各种同步机制,如互斥锁(`pthread_mutex_t`)、条件变量(`pthread_cond_t`)、信号量(`sem_t`)等,用于控制线程间的执行顺序和数据共享安全。 7. **资源释放**:当线程...

    Posix Pthread API 总结文档

    Posix Pthread API 提供了多种线程同步机制,如互斥锁、条件变量、信号量等。 1. 创建互斥锁 pthread_mutex_init 函数用于创建一个互斥锁,该函数需要一个参数:互斥锁的地址。 2. 锁定互斥锁 pthread_mutex_...

    windows 下的pthread 库

    在Windows下使用`pthread`库,开发者需要注意一些移植问题,比如信号量和读写锁在Windows API中实现方式不同,可能需要额外的适配工作。此外,`pthread`库在Windows上可能没有像在Linux那样的优化,性能上可能有所...

    用多线程同步方法解决读者阅览问题

    该程序使用 C 语言编写,使用 POSIX 线程库(pthread)和信号量(semaphore)来实现多线程同步。 知识点1:多线程编程 在本程序中,我们使用了 POSIX 线程库(pthread)来创建多个线程,每个线程负责模拟一个读者...

    pthread windows的库

    2. **线程同步**:pthread库提供了一系列的同步机制,如互斥锁(pthread_mutex_t)、条件变量(pthread_cond_t)和读写锁(pthread_rwlock_t)。互斥锁用于保护共享资源,确保同一时间只有一个线程访问;条件变量则...

    Pthread线程包 Windows移植版

    **Pthread线程包在Windows平台的移植与应用** Pthread,全称为POSIX线程,是UNIX系统标准的一部分,提供了跨平台的多线程编程接口。它在Linux和其他符合POSIX标准的操作系统中广泛使用,允许开发者创建并管理多个...

    由浅入深Linux下pthread线程库介绍

    本文将深入探讨pthread线程库,包括线程的创建与结束、线程绑定、线程状态、线程优先级、线程撤销、线程数据、互斥锁、条件变量、信号量和异步信号等核心概念。 1. 线程创建与结束 - `pthread_t`是线程的标识符,...

    基于信号量的Linux多线程同步研究.pdf

    为了更好地理解如何在实际应用中使用信号量来实现多线程同步,下面通过一个具体例子来进行说明: 假设我们有一个全局变量`shared_data`,需要被多个线程共享,但是每次只能有一个线程对其进行访问。我们可以使用...

Global site tag (gtag.js) - Google Analytics