[英]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.