POSIX线程中互斥量的基本用法举例

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>

void *thread_function( void *arg );
pthread_mutex_t work_mutex;

#define WORK_SIZE 1024
char work_area[WORK_SIZE];
int time_to_exit = 0;

int main()
{
    int res;
    pthread_t a_thread;
    void *thread_result;
    res = pthread_mutex_init( &work_mutex, NULL );
    if( 0 != res ) {
        perror( "Mutex initialization failed");
        exit( EXIT_FAILURE );
    }

    res = pthread_create( &a_thread, NULL, thread_function, NULL );
    if( 0 != res ) {
        perror( "Thread creation failed");
        exit( EXIT_FAILURE );
    }

    pthread_mutex_lock( &work_mutex );
    printf("Input some text. Enter 'end' to finish\n");
    while( 0 == time_to_exit ) {
        fgets( work_area, WORK_SIZE, stdin );
        pthread_mutex_unlock( &work_mutex );
        while(1) {
            pthread_mutex_lock( &work_mutex );
            if( '\0' != work_area[0] ) {
                pthread_mutex_unlock( &work_mutex );
                sleep(1);
            }
            else
                break;
        }
    }

    pthread_mutex_unlock( &work_mutex );
    printf("\nWaiting for thread to finish...\n");
    res = pthread_join( a_thread, &thread_result );
    if( 0 != res ) {
        perror( "Thread join failed" );
        exit( EXIT_FAILURE );
    }

    printf("Thread joined\n");
    pthread_mutex_destroy( &work_mutex );
    exit( EXIT_SUCCESS );
}

void *thread_function( void *arg )
{
    sleep(1);
    pthread_mutex_lock( &work_mutex );
    while( 0 != strncmp( "end", work_area, 3 ) ) {
        printf("You input %d characters\n", strlen(work_area)-1 );
        work_area[0] = '\0';
        pthread_mutex_unlock( &work_mutex );
        sleep(1);
        pthread_mutex_lock( &work_mutex );
        while( '\0' == work_area[0] ) {
            pthread_mutex_unlock( &work_mutex );
            sleep(1);
            pthread_mutex_lock( &work_mutex );
        }
    }
    time_to_exit = 1;
    work_area[0] = '\0';
    pthread_mutex_unlock( &work_mutex );
    pthread_exit( 0 );
}

新线程首先试图对互斥量加锁。如果它已经被锁住,这个调用将被阻塞直到它被释放为止。一旦获得访问权,先检查是否有申请推出程序的请求。如果有,就设置 time_to_exit 变量,再把工作去的第一个字符设置为 \0 ,然后退出。

如果不想退出,就统计字符个数,然后把 work_area 数组中的第一个字符设置为null。我们用将第一个字符设置为 null 的方法通知读取输入的线程,我们已经完成了字符统计。然后解锁互斥量并等待主线程继续执行。我们将周期性地尝试给互斥量加锁,如果加锁成功,就检查是否主线程又有字符送来要处理。如果还没有,就解锁互斥量继续等待;如果有,就统计字符个数并再次进入循环。

也就是说除了第一次输入之外,其他的输入要统计的字符的时候,新线程一直同时在对互斥量加锁解锁,来判断你有没有输入完成。

主线程的代码和新线程中类似,首先给工作区加锁,读入文本到它里面,然后解锁以允许其他线程访问它并统计字符数目。周期性地对互斥量再加锁,检查字符数目是否已经统计完成。如果还需要等待,就释放互斥量。

这种通过论寻来获得结果的方法并不是好的变成方式。在实际的变成中,我们应该尽可能用信号量来避免出现这种情况。

代码运行结果:

时间: 2024-11-03 22:01:18

POSIX线程中互斥量的基本用法举例的相关文章

生产者-消费者问题:介绍POSIX线程的互斥量和条件变量的使用

全局初始化互斥量和条件变量(不全局也行,但至少要对线程启动函数可见,这样才能使用.) static pthread_cont_t cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 使用互斥量锁住一块代码方法如下(默认忽略pthread开头的函数的错误检查,即类似 int s = pthread_xxx(...); if (s != 0) { printErrorMsg(

POSIX线程中的互斥量

互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1. 初始化: 在 Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init. 对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始化, 并且在释放内存(free)前需要调用pthread_mutex_d

pThread线程(二) 线程同步--互斥量/锁

互斥量(Mutex)是“mutual exclusion”的缩写.互斥量是实现线程同步,和保护同时写共享数据的主要方法. 互斥量对共享数据的保护就像一把锁.在Pthreads中,任何时候仅有一个线程可以锁定互斥量,因此,当多个线程尝试去锁定该互斥量时仅有一个会成功.直到锁定互斥量的线程解锁互斥量后,其他线程才可以去锁定互斥量.线程必须轮着访问受保护数据. 一个拥有互斥量的线程经常用于更新全局变量.确保了多个线程更新同样的变量以安全的方式运行,最终的结果和一个线程处理的结果是相同的.这个更新的变量

c++11 线程的互斥量

c++11 线程的互斥量 为什么需要互斥量 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源.这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西,如果不做任何处理的话,打印出来的东西肯定是错乱的. #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <chrono> #include &l

线程同步——互斥量

同步的概念 多个线程可以共享内存空间,在程序中不可避免的需要多个线程协作完成某个功能.那么这些线程就可能会使用某个公共的资源.比如说全局变量,某个文件等等.为了不产生冲突,冲突会产生在多个线程的写操作之间,而读操作则很安全.这就需要多个线程之间的同步. 互斥量的原理 互斥量 实现同步的机制很好理解.可以将互斥量想象为锁.只有当一个线程获得该锁时才有权限对共享资源的操作.从而可以理解为该线程对共享资源上了一把锁,其他线程无权操作.在此线程操作完成之后,需要解锁以便其他线程可以获得该锁.可以想的出来

(转)经典线程同步 互斥量Mutex

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> 前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用互斥量Mutex来解决这个问题. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互斥量Mutex主要将用到四个函数.下面是这些函数

转--- 秒杀多线程第七篇 经典线程同步 互斥量Mutex

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> 前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用互斥量Mutex来解决这个问题. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互斥量Mutex主要将用到四个函数.下面是这些函数

秒杀多线程第七篇 经典线程同步 互斥量Mutex

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> 前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用互斥量Mutex来解决这个问题. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互斥量Mutex主要将用到四个函数.下面是这些函数

linux系统编程:线程同步-互斥量(mutex)

线程同步-互斥量(mutex) 线程同步 多个线程同时访问共享数据时可能会冲突,于是需要实现线程同步. 一个线程冲突的示例 #include <stdio.h> #include <unistd.h> #include <pthread.h> #define Loop 1000000 //全局资然 int counter = 0; void *fun(void *argv) { int i; for (i = 0; i < Loop; i++) { counter