【发布时间】:2019-04-29 21:34:47
【问题描述】:
我正在为一项作业制作并行密码破解程序。当我启动多个线程时,我添加的线程越多,破解所需的时间就越长。这里有什么问题?
其次,我还可以使用哪些资源共享技术来获得最佳性能?我需要使用互斥锁、原子操作或屏障,同时还需要使用信号量、条件变量或通道。互斥锁似乎大大减慢了我的程序。
这是我的上下文代码示例:
std::mutex mtx;
std::condition_variable cv;
void run()
{
std::unique_lock<std::mutex> lck(mtx);
ready = true;
cv.notify_all();
}
crack()
{
std::lock_guard<std::mutex> lk(mtx);
...do cracking stuff
}
main()
{
....
std::thread *t = new std::thread[uiThreadCount];
for(int i = 0; i < uiThreadCount; i++)
{
t[i] = std::thread(crack, params);
}
run();
for(int i = 0; i < uiThreadCount; i++)
{
t[i].join();
}
}
【问题讨论】:
-
您的代码中没有并行发生的事情。所有线程一开始就锁定同一个互斥体。
-
另请注意,创建和管理线程会带来一些开销。拥有更多它们并不会自动加快您的计算速度。
-
我很确定代码不会编译。
-
完全不相关,但可能会为您节省一些未来的麻烦:根据需要将
std::thread *t = new std::thread[uiThreadCount];替换为std::vector<std::thread>和emplace_back线程。
标签: c++ multithreading mutex