互斥锁和许多线程

时间:2017-07-01 12:37:46

标签: c multithreading pthreads mutex

我有一个API(用C编写),允许任意数量的传入(并发)连接。每当客户端连接到API时,每个连接都由创建的独立pthread处理。 这些连接中的每一个都可以(但不必)更改服务器的属性,以便不应同时处理请求。

我的代码基本上遵循以下结构:

pthread_mutex_t lock;
void request_handler(char * request)
{
    pthread_mutex_lock(&lock);
    process_request(request);
    pthread_mutex_unlock(&lock);
}

现在假设正在处理一个需要很长时间(例如十秒)的请求。在这段时间内,有五个其他请求进入,因此有五个附加 pthreads将在pthread_mutex_lock函数中达到。

  • 他们只是在那里等待并按预期继续(一个接一个地送达)?

我之所以这样问是因为这是我所期望的,但我没有找到官方文档中有多个并发线程的示例。

  • 是否可以保证请求将按照收到的顺序进行处理,或者在长请求完成后,任何五个等待线程中的任何一个可以启动?< / LI>

我的代码需要严格按顺序执行而不是,但我想事先知道为了正确设计我的代码会发生什么。

我还读到了递归mutex,但由于种种原因,我想避免使用它们。此外,我的代码不会尝试通过构造从单个pthread多次锁定。

1 个答案:

答案 0 :(得分:2)

互斥锁确保一次只有一个线程进入代码的关键部分,在您的情况下,一次调用process_request()。一旦线程t获得锁定,任何后续线程都必须等到t释放它。

如果多个这样的线程到达,谁有机会先行取决于操作系统对线程的调度,这不是确定性的,并且每次运行程序时都可能不同。但是,保证每次只能传递一个线程。