为啥在多线程应用程序 C++ 中没有发生同步

Posted

技术标签:

【中文标题】为啥在多线程应用程序 C++ 中没有发生同步【英文标题】:Why the synchronization is not happening in multithread application c++为什么在多线程应用程序 C++ 中没有发生同步 【发布时间】:2013-09-30 18:56:51 【问题描述】:

我是多线程的新手。 当我运行以下程序时,它的输出为

Function1
Function2
1000...1001

但是当我调试程序时,它会按预期输出。

1000...1001
Function1
Function2

所以,我认为在直接运行时(无需调试)模式会出现一些同步问题。但有一件事让我很困惑,我使用的是mutex,那么为什么会出现同步问题?

请帮帮我。

#include <iostream>
#include <cstdlib>
#include <pthread.h>

using namespace std;

pthread_mutex_t myMutex;
void * function1(void * arg);
void * function2(void * arg);
void * function0(void * arg);
int count = 0;
const int COUNT_DONE = 10;

main()

  pthread_t thread1, thread2, thread0;
  pthread_mutex_init(&myMutex, 0);
  pthread_create(&thread0, NULL, &function0, NULL );
  pthread_create(&thread1, NULL, &function1, NULL );
  pthread_create(&thread2, NULL, &function2, NULL );
  pthread_join(thread0, NULL );
  pthread_join(thread1, NULL );
  pthread_join(thread2, NULL );
  pthread_mutex_destroy(&myMutex);
  return 0;


void *function1(void * arg)

  cout << "Function1\n";


void *function0(void *arg)

  int i, j;
  pthread_mutex_lock(&myMutex);
  for (i = 0; i <= 1000; i++)
  
    for (j = 0; j <= 1000; j++)
    
    
  
  cout << i << "..." << j << endl;
  pthread_mutex_unlock(&myMutex);


void *function2(void * arg)

  cout << "Function2\n";

【问题讨论】:

空循环有什么用?编译器可能会删除它们。另外,请解释互斥锁应该如何强制排序 @Leeor:Mtex 用于同步目的! 您不应该同时在function2function1 上使用互斥锁吗? @RasmiRanjanNayak - 仅在正确使用的情况下... @nims:现在我在这两个函数中都加入了互斥锁。但结果是相同的没有改变 【参考方案1】:

...遇到一些同步问题”您在哪里看到问题?

线程输出可以以任何顺序出现,因为线程在任何情况下都不会同步。

互斥锁只在一个线程中使用。

还有

Function1
1000...1001 
Function2

可能是可预期且有效的结果。

还有:

1000
Function1
... 
Function2
1001

像这样修改function1()function2()

void *function1(void * arg)

  pthread_mutex_lock(&myMutex);
  cout << "Function1\n";
  pthread_mutex_unlock(&myMutex);


void *function2(void * arg)

  pthread_mutex_lock(&myMutex);
  cout << "Function2\n";
  pthread_mutex_unlock(&myMutex);

会保护程序不产生我的第二个示例输出。

【讨论】:

我也将互斥锁应用于其他两个函数。但结果也没有改变 你肯定不会得到第二种情况。互斥锁保护混合 3 个输出语句,但不影响它们的顺序。 您可能会思考互斥锁将如何以及为什么影响 3 个输出的顺序。 互斥体不赋予任何排序。它们只确保只有一个持有互斥锁的线程同时运行。请求对互斥锁进行锁定的线程可以按任何顺序执行。记住 mutex 是 mutual exclusion 的缩写。如果您需要保证执行顺序,您将需要一个更复杂的锁定方案,可能使用条件变量。

以上是关于为啥在多线程应用程序 C++ 中没有发生同步的主要内容,如果未能解决你的问题,请参考以下文章

在多线程应用程序中同步属性值的正确方法

在多线程 C++ 程序中使用 std::vector 时应用程序崩溃

有没有办法在多线程应用程序中安全地使用 errno? [复制]

在多线程 C++ 应用程序中测量时间

对于多线程应用程序,为啥需要同步实现(如果要求没有说明)

在多线程C ++应用程序中,我是否需要一个互斥锁来保护一个简单的布尔值?