代码之家  ›  专栏  ›  技术社区  ›  Alex

在C语言中对两个函数使用pthreads

  •  1
  • Alex  · 技术社区  · 15 年前

    我对pthreads完全不熟悉,在我看过的所有网站上似乎都有很多不必要的信息。

    我有两个函数,现在我们称它们为X和Y,它们都在内存块上工作。如果一个线程正在运行X,我不希望任何其他线程在同一块上调用X或Y,我如何确保这永远不会发生?

    是否需要为某些块值锁定函数?

    4 回复  |  直到 15 年前
        1
  •  0
  •   caf    15 年前

    也许一些演示代码是正确的。假设你有一个这样的块头:

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

    您需要小心确保即使在错误返回路径中也会解锁互斥锁。

        2
  •  2
  •   Joseph Stine    15 年前

    您需要使用互斥锁。

    你不应该锁定代码,你应该锁定数据。为每个块创建一个互斥锁,并在函数对块进行操作时将其锁定,然后在完成时将其解锁。

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

    网上有很多教程。谷歌“pthread教程”和你应该找到足够的开始自己。

        3
  •  1
  •   jim mcnamara    15 年前

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

    第一种方法更容易实现——只是对整个函数X或Y使用all或nothing方法。

        4
  •  0
  •   Roderick Taylor    15 年前

    在高级语言中使用多线程编程确实能更好地解决问题。在C语言中有些东西很难理解,在我看来,多线程就是其中之一。我发现Java让我对问题有了更好的感觉。它更容易理解概念和阅读文档。如果Java不是你的东西,那么C++框架如POCO或QT也会更好。

    正如其他人所说,从概念上讲,您希望锁定资源(在您的情况下是内存的一部分)。作为一个概念,信号量比互斥量更适合这个问题。我会研究信号量,把互斥量看作是信号量的构建块。如果你问我,互斥量是一个名称不好的二进制信号量。