繁体   English   中英

P线程和信号C ++

[英]Pthreads and signals C++

我是线程新手,似乎有时间问题。 当我运行代码时,我的输出是...

收到数据!
数据已处理!

然后就挂了。 我以为我使用了等待并发出错误的信号。 帮助将不胜感激。

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

char buffer [100];
pthread_mutex_t buffer_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t buffer_cond = PTHREAD_COND_INITIALIZER;

void* threadFunc(void *proc){
    if((int)proc == 0){
        pthread_mutex_lock(&buffer_mutex);
        sprintf(buffer, "Data received!\n");
        printf("%s", buffer);
        pthread_cond_signal(&buffer_cond);
        pthread_mutex_unlock(&buffer_mutex);
    }
    else if((int)proc == 1){
        pthread_mutex_lock(&buffer_mutex);
        pthread_cond_wait(&buffer_cond, &buffer_mutex);
        sprintf(buffer, "Data processed!\n");
        printf("%s", buffer);
        pthread_cond_signal(&buffer_cond);
        pthread_mutex_unlock(&buffer_mutex);
    }
    else{
        sleep(1);
        pthread_mutex_lock(&buffer_mutex);
        pthread_cond_wait(&buffer_cond, &buffer_mutex);
        sprintf(buffer, "Data sent!\n");
        printf("%s", buffer);
        pthread_mutex_unlock(&buffer_mutex);
    }

    return(NULL);
}

int main()
{
    pthread_t threads[3];

    for(int i = 0; i < 3; i++){
        pthread_create(&threads[i], NULL, threadFunc, (void *) i);
    }

    for(int i = 0; i < 3; i++){
        pthread_join(threads[i], NULL);
    }

    return 0;
}

没有谓词的条件变量几乎是无用的, 谓词是指示发生了什么变化的条件状态。 条件变量只不过是一种信号机制,用于宣布“某些内容”可能已更改,但是您仍然需要管理“内容”。 而那个互斥体就是保护“什么”的原因。

例如:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <pthread.h>

char buffer [100];
int state = 0;

pthread_mutex_t buffer_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t buffer_cond = PTHREAD_COND_INITIALIZER;

void* threadFunc(void *proc)
{
    intptr_t iptr = (intptr_t)proc;
    pthread_mutex_lock(&buffer_mutex);

    switch(iptr)
    {
        case 0:
        {
            while (state != 1) // 1 means data available
                pthread_cond_wait(&buffer_cond, &buffer_mutex);

            // mutex is locked. access predicate data
            printf("Data received: %s\n", buffer);
            state = 2; // advance state
            pthread_mutex_unlock(&buffer_mutex);
            pthread_cond_broadcast(&buffer_cond);
        }
        break;

        case 1:
        {
            while (state != 2)
                pthread_cond_wait(&buffer_cond, &buffer_mutex);

            // mutex is locked. access predicate data
            printf("Data processed: %s\n", buffer);
            pthread_mutex_unlock(&buffer_mutex);
        }
        break;

        default:
        {
            // setup initial send-state
            printf("Data sent: %s\n", buffer);
            state = 1;
            pthread_mutex_unlock(&buffer_mutex);
            pthread_cond_broadcast(&buffer_cond);
        }
    }
    return NULL;
}

int main()
{
    pthread_t threads[3];
    intptr_t i = 0;

    strcpy(buffer, "Some message");

    for(i = 0; i < 3; i++){
        pthread_create(&threads[i], NULL, threadFunc, (void *) i);
    }

    for( i = 0; i < 3; i++)
        pthread_join(threads[i], NULL);

    return 0;
}

输出量

Data sent: Some message
Data received: Some message
Data processed: Some message

这仅启动了三个线程。 一个(id = 0)将等待状态变为1,然后继续进行宣布发生的情况,推进状态并发出状态信号的工作。 第二个(id = 1)等待该状态,类似地执行其工作,然后退出,因为没有其他可进行的操作。 第三个(id = 2)是启动该过程,然后默默完成的过程。

注意,无论处于什么状态下,谓词数据(状态)在任何时候都不会在互斥对象的保护下进行更改或检查 ,无论线程正在执行上述检查/更改。

三个具有互斥锁状态和拥有该线程的时间线将在理解其工作方式方面发挥重要作用,我强烈建议您拿一支铅笔和纸来帮助解决这一问题。

祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM