Multithreading 将所有代码放在互斥锁和互斥锁解锁之间是否会导致多线程(ness)变得毫无意义

Multithreading 将所有代码放在互斥锁和互斥锁解锁之间是否会导致多线程(ness)变得毫无意义,multithreading,pthreads,mutex,Multithreading,Pthreads,Mutex,假设我正在编写一个多线程服务器,它从客户机接收不同的数据库查询,查找数据库并返回结果 如果我把所有的服务器代码都放在互斥锁和互斥锁中,以接收客户端查询、数据库查找和对客户端的响应,这难道不意味着新线程必须等待整个代码执行吗?那么,这是否类似于为单线程服务器的所有客户端请求运行for循环 我觉得唯一的区别是for循环从1执行到100,比如按顺序执行,但是对于下面这样的循环,线程的顺序无法预测 pthread_t th[100]; for(i=0;i<100;i++) { pthread_c

假设我正在编写一个多线程服务器,它从客户机接收不同的数据库查询,查找数据库并返回结果

如果我把所有的服务器代码都放在互斥锁和互斥锁中,以接收客户端查询、数据库查找和对客户端的响应,这难道不意味着新线程必须等待整个代码执行吗?那么,这是否类似于为单线程服务器的所有客户端请求运行for循环

我觉得唯一的区别是for循环从1执行到100,比如按顺序执行,但是对于下面这样的循环,线程的顺序无法预测

pthread_t th[100];
for(i=0;i<100;i++)
{
 pthread_create(&th[i], NULL, fun, NULL);
}
pthread_t th[100];

对于C++中的并发操作中的i=0;i,Anthony Williams说使用并发的原因有两个:

  • 演出
  • 关注点分离
  • 可选原因

  • 因为我想
  • 你是对的,创建100个线程,然后在一个互斥体上串行化它们,这使得多线程没有意义,它实际上伤害了#1,对#2没有任何作用。它会给操作系统带来100个线程的负担,一次只能运行其中一个线程,因为其余线程将在等待互斥体时被阻塞/串行化,这将导致不必要的错误上下文切换开销,以及互斥锁本身的开销

    为数据库请求提供服务的服务器应该是多线程的,适用于#1和#2


    当新请求到达时,可以创建新线程。替代方法是。一个线程接受请求,并创建一个新线程(或排队到线程池)若要处理该请求,则返回接受另一个请求。请参阅。是否需要在互斥锁上序列化以访问数据库取决于数据库,大多数情况下都允许并发连接,请参阅

    我假设您的意思是,只有一个锁,其中每个线程在同一个锁的保护下完成其所有工作。是的,我的意思是一个块,其中一个互斥锁互斥解锁跨越整个块。感谢@DavidSchwartz的回复。