Poco线程同步问题
Poco thread synchronization issue
以下是示例Poco线程程序,用于了解互斥锁和线程同步。仍然看到同一程序的不同输出。
#include "Poco/ThreadPool.h"
#include "Poco/Thread.h"
#include "Poco/Runnable.h"
#include "Poco/Mutex.h"
#include <iostream>
#include <unistd.h>
using namespace std;
class HelloRunnable: public Poco::Runnable
{
public:
static int a;
HelloRunnable(){
}
HelloRunnable(unsigned long n):_tID(n){
}
void run()
{
Poco::Mutex::ScopedLock lock(_mutex);
std::cout << "==>> In Mutex thread " << _tID << endl;
int i;
for (i=0;i<50000;i++)
{
a = a+1;
}
Poco::Mutex::ScopedLock unlock(_mutex);
}
private:
unsigned long _tID;
Poco::Mutex _mutex;
};
int HelloRunnable::a = 0;
int main(int argc, char** argv)
{
Poco::Thread thread1("one"), thread2("two"), thread3("three");
HelloRunnable runnable1(thread1.id());
HelloRunnable runnable2(thread2.id());
HelloRunnable runnable3(thread3.id());
thread1.start(runnable1);
thread2.start(runnable2);
thread3.start(runnable3);
thread1.join();
thread2.join();
thread3.join();
cout << "****>> Done and a: " << HelloRunnable::a << endl;
return 0;
}
获取输出如下:
OutPut1:
==>> 在 Mutex 线程 1
==>> 在 Mutex 线程 2
==>> 在 Mutex 线程 3
****>> 完成并:142436
OutPut2:
==>> 在 Mutex 线程 2=>> 在 Mutex 线程 3
==>> 在 Mutex 线程 1
****>> 完成并:143671
OutPut3:
==>> 在 Mutex 线程 2
==>> 在 Mutex 线程 3
==>> 在 Mutex 线程 1
****>> 完成并:150000
我一直期待 OutPut3 作为结果。上面的程序有什么问题?
互斥量是class的非静态成员变量,这意味着class的每个实例都有自己的互斥量。如果要同步,则需要在线程之间共享互斥锁。你需要做到 static
.
同样在 run
函数中,变量 unlock
不做任何事情。对象 lock
将在超出范围时解锁互斥量,即函数 returns.
以下是示例Poco线程程序,用于了解互斥锁和线程同步。仍然看到同一程序的不同输出。
#include "Poco/ThreadPool.h"
#include "Poco/Thread.h"
#include "Poco/Runnable.h"
#include "Poco/Mutex.h"
#include <iostream>
#include <unistd.h>
using namespace std;
class HelloRunnable: public Poco::Runnable
{
public:
static int a;
HelloRunnable(){
}
HelloRunnable(unsigned long n):_tID(n){
}
void run()
{
Poco::Mutex::ScopedLock lock(_mutex);
std::cout << "==>> In Mutex thread " << _tID << endl;
int i;
for (i=0;i<50000;i++)
{
a = a+1;
}
Poco::Mutex::ScopedLock unlock(_mutex);
}
private:
unsigned long _tID;
Poco::Mutex _mutex;
};
int HelloRunnable::a = 0;
int main(int argc, char** argv)
{
Poco::Thread thread1("one"), thread2("two"), thread3("three");
HelloRunnable runnable1(thread1.id());
HelloRunnable runnable2(thread2.id());
HelloRunnable runnable3(thread3.id());
thread1.start(runnable1);
thread2.start(runnable2);
thread3.start(runnable3);
thread1.join();
thread2.join();
thread3.join();
cout << "****>> Done and a: " << HelloRunnable::a << endl;
return 0;
}
获取输出如下:
OutPut1:
==>> 在 Mutex 线程 1
==>> 在 Mutex 线程 2
==>> 在 Mutex 线程 3
****>> 完成并:142436
OutPut2:
==>> 在 Mutex 线程 2=>> 在 Mutex 线程 3
==>> 在 Mutex 线程 1
****>> 完成并:143671
OutPut3:
==>> 在 Mutex 线程 2
==>> 在 Mutex 线程 3
==>> 在 Mutex 线程 1
****>> 完成并:150000
我一直期待 OutPut3 作为结果。上面的程序有什么问题?
互斥量是class的非静态成员变量,这意味着class的每个实例都有自己的互斥量。如果要同步,则需要在线程之间共享互斥锁。你需要做到 static
.
同样在 run
函数中,变量 unlock
不做任何事情。对象 lock
将在超出范围时解锁互斥量,即函数 returns.