互斥锁和线程数
Mutex lock and a number of threads
我有一个 API(写在 C
中),它允许任意数量的传入(并发)连接。每个连接都由客户端连接到 API 时创建的独立 pthread
处理。
这些连接中的每一个都可以(但不必)更改服务器的属性,以便不应同时处理请求。
我的代码基本上是这样的结构:
pthread_mutex_t lock;
void request_handler(char * request)
{
pthread_mutex_lock(&lock);
process_request(request);
pthread_mutex_unlock(&lock);
}
假设现在正在处理一个需要很长时间(例如十秒)的请求。这一次,还有五个其他请求进来,所以五个 additional pthreads
将到达 pthread_mutex_lock
函数。
- 他们是否只是在那里等待并按预期继续(一个接一个地服务)?
之所以问这个问题,是因为这是我所期望的,但我在官方文档中没有找到包含多个并发线程的示例。
- 是否保证请求将按照接收到的相同顺序处理,或者 任何 五个等待线程中的任何一个都可以在长请求完成了吗?
我的代码不需要严格按顺序执行,但我想事先知道为了正确设计我的代码会发生什么。
我也读过递归 mutex
,但出于多种原因我想避免使用它们。此外,我的代码不会尝试通过构造从一个 pthread
中多次锁定。
互斥锁确保只有一个线程一次进入代码的关键部分,在您的情况下,即对 process_request()
的调用。一旦一个线程 t
获得锁,任何后续线程必须等待直到 t
释放它。
如果有多个这样的线程到达,谁有机会先走取决于操作系统对线程的调度,这是不确定的,每次 运行 程序时都可能不同。但是,保证每次只有一个线程可以通过。
我有一个 API(写在 C
中),它允许任意数量的传入(并发)连接。每个连接都由客户端连接到 API 时创建的独立 pthread
处理。
这些连接中的每一个都可以(但不必)更改服务器的属性,以便不应同时处理请求。
我的代码基本上是这样的结构:
pthread_mutex_t lock;
void request_handler(char * request)
{
pthread_mutex_lock(&lock);
process_request(request);
pthread_mutex_unlock(&lock);
}
假设现在正在处理一个需要很长时间(例如十秒)的请求。这一次,还有五个其他请求进来,所以五个 additional pthreads
将到达 pthread_mutex_lock
函数。
- 他们是否只是在那里等待并按预期继续(一个接一个地服务)?
之所以问这个问题,是因为这是我所期望的,但我在官方文档中没有找到包含多个并发线程的示例。
- 是否保证请求将按照接收到的相同顺序处理,或者 任何 五个等待线程中的任何一个都可以在长请求完成了吗?
我的代码不需要严格按顺序执行,但我想事先知道为了正确设计我的代码会发生什么。
我也读过递归 mutex
,但出于多种原因我想避免使用它们。此外,我的代码不会尝试通过构造从一个 pthread
中多次锁定。
互斥锁确保只有一个线程一次进入代码的关键部分,在您的情况下,即对 process_request()
的调用。一旦一个线程 t
获得锁,任何后续线程必须等待直到 t
释放它。
如果有多个这样的线程到达,谁有机会先走取决于操作系统对线程的调度,这是不确定的,每次 运行 程序时都可能不同。但是,保证每次只有一个线程可以通过。