Pergunta

Eu sou completamente novo no Pthreads e parece haver muitas informações desnecessárias sobre todo o site que olhei.

Eu tenho duas funções, vamos chamá -los de X e Y por enquanto, esses dois funcionam em blocos na memória. Se um thread estiver executando o XI não quer que outros threads ligue para X ou Y no mesmo bloco, como posso garantir que isso nunca aconteça?

Preciso mutex bloquear as funções para determinados valores de bloco?

Foi útil?

Solução

Talvez algum código de demonstração esteja em ordem. Presumindo que você tenha um cabeçalho de bloco como assim:

struct block {
    void *data;
    size_t len;
};

Você protegeria o bloco adicionando uma variável mutex a esta estrutura:

struct block {
    void *data;
    size_t len;
    pthread_mutex_t lock;
};

Você precisa atualizar a função de inicialização para esta estrutura para inicializar o bloqueio:

struct block *new_block(size_t len)
{
    struct block *b = malloc(sizeof *b);
    b->data = malloc(len);
    b->len = len;

    pthread_mutex_init(&b->lock, NULL);

    return b;
}

As funções X e Y (e algum outra função que lê ou grava no bloco) e depois precisam pegar o bloqueio e liberá -lo na saída:

int x(struct block *b)
{
    int retval;

    pthread_mutex_lock(&b->lock);

    /* code */

    pthread_mutex_unlock(&b->lock);
    return retval;
}

int y(struct block *b)
{
    int retval;

    pthread_mutex_lock(&b->lock);

    /* code */

    pthread_mutex_unlock(&b->lock);
    return retval;
}

Você precisa ter cuidado para garantir que você desbloqueie o Mutex, mesmo nos caminhos de retorno de erros também.

Outras dicas

Você precisará usar mutexes.

Você não deve bloquear o código, você deve bloquear os dados. Crie um mutex para cada bloco e bloqueie -o enquanto uma função estiver operando no bloco e desbloqueie -o quando terminar.

Um mutex é um tipo definido por pthread.h, pthread_mutex_t. As funções são fornecidas para bloquear e desbloquear o mutex. Essas funções garantem que apenas um thread possa ganhar um bloqueio por vez (se você apenas usou uma variável para indicar que seu bloco está sendo usado, você terá problemas de simultaneidade com essa variável em vez do bloco).

Existem inúmeros tutoriais disponíveis online. Google "Pthread Tutorial" e você deve encontrar o suficiente para começar.

Você bloqueia o recurso - nesse caso, um bloco de memória - com um mutex. Como alternativa, você pode bloquear apenas as partes do seu código de funções que leem/atualizam essa área de memória. Isso é chamado de seção crítica e requer um aprovocch diferente para a codificação. Isso significa que seus threads são livres para operar, exceto quando eles atingem a parte em que interagem com o recurso.

O primeiro método é mais fácil de implementar - apenas uma abordagem de tudo ou nada para toda a função x ou y.

A programação multithread é realmente melhor resolvida usando em linguagens de nível superior. Algumas coisas são difíceis de entender em C e, na minha opinião, o Mutli-Threading é um deles. Descobri que Java me deu uma sensação melhor para os problemas e problemas. Tem mais fácil entender conceitos e mais fácil ler a documentação. Uma estrutura C ++, como POCO ou QT, também seria melhor se Java não for o seu.

Como outros disseram, conceitualmente você deseja bloquear os recursos (no seu caso, uma seção de memória). Semáforos, como conceito, se encaixam muito no problema muito melhor do que o Mutex. Eu pesquisava semáforos e pensava nos mutexes como um bloco de construção de semáforos. Se você me perguntar, um mutex é um semáforo binário mal chamado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top