繁体   English   中英

在C中的两个函数上使用pthreads

[英]Using pthreads on two functions in C

我对pthread完全陌生,在我浏览过的所有网站上似乎都有很多不必要的信息。

我有两个函数,现在暂时将它们称为X和Y,它们都在内存中的块上工作。 如果一个线程正在运行XI,而又不希望其他任何线程在同一块上调用X或Y,那么如何确保这种情况永远不会发生呢?

我是否需要互斥锁定某些块值的功能?

您将需要使用互斥锁。

您不应锁定代码,而应锁定数据。 为每个块创建一个互斥锁,并在对该块执行功能时将其锁定,然后在完成时将其解锁。

互斥锁是由pthread.h pthread_mutex_t定义的类型。 提供了锁定和解锁互斥锁的功能。 这些函数确保一次仅一个线程可以获得一个锁(如果您只是使用一个变量来指示正在使用您的块,则该变量而不是块将具有并发性问题)。

在线上有许多教程。 Google的“ pthread教程”,您应该找到足够的入门知识。

使用互斥锁锁定资源(在本例中为内存块)。 或者,您可以仅锁定功能代码中读取/更新该内存区域的部分。 这被称为关键部分,并且需要不同的编码方式。 这意味着您的线程可以自由操作,除非它们到达与资源交互的那一部分。

第一种方法更易于实现-整个函数X或Y只需采用全有或全无的方法。

也许一些演示代码是有序的。 假设您有一个像这样的块头:

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

您可以通过向此结构添加互斥变量来保护该块:

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

然后,您需要为此结构更新初始化函数以初始化锁:

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;
}

然后,X和Y函数(以及任何其他读取或写入该块的函数)需要获取该锁并在出口处释放它:

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;
}

您还需要注意即使在错误返回路径中也要解锁互斥锁。

使用高级语言确实可以更好地解决多线程编程问题。 有些事情用C语言很难理解,我认为,多线程是其中之一。 我发现Java使我对这些问题有了更好的了解。 它使概念更容易理解,文档也更容易阅读。 如果您不喜欢Java,那么Poco或Qt之类的C ++框架也会更好。

正如其他人所说,从概念上讲,您想锁定资源(在您的情况下为一部分内存)。 作为一个概念,信号量比互斥量更适合解决此问题。 我会研究信号量,而只是将互斥锁视为信号量的构建块。 如果您问我,互斥锁是一个名称不正确的二进制信号量。

暂无
暂无

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

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