为啥在多线程应用程序 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 用于同步目的! 您不应该同时在function2
和function1
上使用互斥锁吗?
@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 时应用程序崩溃