背景:我在某个位置有一个文件列表,并使用moveFile()函数将这些文件移动。我的目标是并行移动所有这些文件。因此,我实现了多个线程。

为了避免冲突,我最初在moveFile()之前考虑了互斥锁。这将阻止线程并行运行。

实施方法如下:

std::mutex mtx;
enum class status
{ SUCCESS, FAILED };

status moveFile()
{   //function implementation }

void fileOperator()
{   // This is prevent parallel operation
    mtx.lock;
      moveFile();
    mtx.unlock;
}

int main ()
{
  int threadSize= 3; //generic size
  std::thread fileProc[threadSize];
  int index = 0;

  // staring new threads
  for (index; index < threadSize; index++)
  {
    fileProc[index] = std::thread (&fileOperator);
  }

  //joining all the threads
  for (int i=0; i <threadSize; i++)
  {
    fileProc[i].join();
  }
  return 0;
}

建议:我想知道,如果我像在一个类中那样删除互斥锁实现moveFile()并将其作为对象方法调用,这将是实现并行操作的更好方法吗?

最佳答案

不太清楚这里是什么问题,很可能是在moveFile函数中,但是类似的东西应该可以工作:

#include <future>
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>

std::mutex mtx;

enum class status { SUCCESS, FAILED };

status moveFile() {
    std::cout << "Moving file" << std::endl;
    return status::SUCCESS;
}

void fileOperator() {
    std::lock_guard<std::mutex> lock(mtx);
    moveFile();
}

int main(int argc, char** argv) {
    std::vector<std::thread> threads;
    int threadSize = 3;

    for (int index = 0; index < threadSize; ++index) {
        threads.push_back(std::thread(&fileOperator));
    }

    for (auto& th : threads) {
        th.join();
    }
    return 0;
}

您还可以发布moveFile的内容来帮助您吗?谢谢。

09-06 19:16