用C ++创建线程队列

时间:2016-06-15 20:19:51

标签: c++ multithreading

我正在尝试一个接一个地运行线程。我知道我可以连续执行它们,但重点是命令不会阻止UI。

然而,在我提出的实现中,我不能使用std::thread,因为我不能将线程作为参数传递。

我还有其他办法吗?

这是我目前的实施:

#include <mutex>
#include <thread>
#include <queue>

class ThreadQueue {
    std::queue <std::thread> threads;
    std::mutex mutex_add;
    std::mutex mutex_remove;

public:
   ThreadQueue() {}

    ~ThreadQueue() {}

    void add(std::thread thread) {
        mutex_add.lock();
        threads.push(thread);
        mutex_add.unlock();
    }

    std::thread remove() {
        mutex_remove.lock();
        std::thread thread = threads.front;
        threads.pop();
        thread.join();
        mutex_remove.unlock();
    }
};

2 个答案:

答案 0 :(得分:4)

  

我知道我可以连续进行,但重点是命令不会阻止用户界面。

           

我还有其他办法吗?

如前所述, <div ng-repeat="(key, value) in rowData"> <div ng-if="(key === 'id' || key.toLowerCase().endsWith('id') === false) ? true : false"> <label for="value" class="col-sm-2">{{key}}</label> <div class=" col-sm-2"> <input class="form-control rowValue" ng-if="!isObject(rowData[key])" type="text" ng-model="value"/> <input class="form-control rowValue" ng-if="isObject(value) && key !== 'status' && key !== 'priority' && key !== 'severity'" type="text" ng-model="value.name"/> <select ng-if="isObject(value) && key == 'status'" ng-model="statusId" class="form-control rowValue" id="statusId" ng-options='item.id as item.name for item in eventService.statusOptions()' > <option value=''>{{value.name}}</option> </select> <select ng-if="isObject(value) && key == 'priority'" ng-model="priorityId" class="form-control rowValue" id="priorityId" ng-options='item.id as item.name for item in eventService.priorityOptions()' > <option value=''>{{value.name}}</option> </select> <select ng-if="isObject(value) && key == 'severity'" ng-model="severityId" class="form-control rowValue" id="severityId" ng-options='item.id as item.name for item in eventService.priorityOptions()' > <option value=''>{{value.name}}</option> </select> </div> </div> </div> 是一个可移动的类类型,您可以使用std::thread将它们传输到队列中。

但我认为使用std::move()个实例的队列不是一个好设计。

假设您将线程实例放置到使用线程函数的队列中,它将立即启动。那么,队列的作用是什么呢? 线程一旦启动就应该从队列中弹出来吗?谁会去std::thread呢?

作为@alexeibs suggests,你应该有一个线程,它执行从队列中读取的UI后台任务(例如join()个对象)。

您甚至可以让多个线程(也称为thread pool)共享此类任务队列,并最大化您的可用CPU核心数量。利用率(理想情况下,您不应该拥有比可用CPU核心更多的活动线程)。

同步(互斥,用于通知的条件变量等)应该应用于队列本身。

答案 1 :(得分:2)

你可以移动线程:

所以你可以简单地修改你的代码。

<div ng-show="showme=='4'">
<body>
<div ng-app="app">
  <div class="container">
    <div ng-controller="ClientCtrl">
      <div class="datagrid">
        <table>
          <thead>
            <tr>
              <th> Checks/Offers Received </th>
              <th> Disbursement </th>
              <th> Client Ins Settled Amount </th>
              <th> Case Fee Percentage</th>
            </tr>
          </thead>
        </table>
      </div>
    </div>
  </div>
</div>
</body>
<body>
<div ng-app="offer">
  <div class="container">
    <div ng-controller="OfferCtrl">
      <div class="datagrid">
        <table>
          <tbody>
            <td>
              <div class="dropdown">
                <button class="dropbtn">Offers</button>
                <div class="dropdown-content">
                  <li ng-repeat="offer in offers | filter:{clientid:clientId}">
                    <input type="text" value="{{offer.offeramnt}}" />
                    <a href="#">Offer 2</a>
                    <a href="#">Offer 3</a>
                  </li>
                </div>
              </div>
            </td>
          </tbody>
        </table>
      </div>
    </div>
  </div>
</div>
</body>
<body>
<div ng-app="check">
  <div class="container">
    <div ng-controller="CheckCtrl">
      <div class="datagrid">
        <table>
          <tbody>
            <td>
              <div class="dropdown">
                <button class="dropbtn">Checks</button>
                <div class="dropdown-content">
                  <li ng-repeat="check in checks | filter:{clientid:clientId}">
                    <input type="text" value="{{check.checkamount}}" />
                    <a href="#">Check 2</a>
                    <a href="#">Check 3</a>
                  </li>
                </div>
              </div>
            </td>
          </tbody>
        </table>
      </div>
    </div>
  </div>
</div>
</body>
<body>
<div ng-app="app">
  <div class="container">
    <div ng-controller="ClientCtrl">
      <div class="datagrid">
        <table>
          <tbody>
            <tr>
              <td>
                <input type="string" value=" {{client.checksreceived}}" />
              </td>
              <td>
                <input type="text" value="{{client.clientinssettlesamnt}}" />
              </td>
              <td>
                <input type="number" value="{{client.casefeepercent}}" />
              </td>
            </tr>
          </tbody>
          <thead>
            <tr>
              <th> Adverse Settle Amount </th>
              <th> Case cost </th>
              <th> Line Item Fees</th>
              <th> Loan Information </th>
            </tr>
          </thead>
          <tbody>
            <tr ng-repeat="client in clients | orderBy:'id' | filter:{id:clientId} | limitTo: 1 track by $index" ">
       <td>
        <input type="numer" value=" {{client.advsettleamnt}}"/>
       </td>
       <td>
        <input type="number "  value="{{client.Casecost}} "/>
       </td>
       <td>
        <input type="number "  value="{{client.lineitemfees}} "/>
       </td>
       <td>
        <input type="text "  value="{{client.bdf}} "/>
       </td>
       </tr>
     </tbody>
    </table>
   <button type="submit " ng-click="updateClient() "><strong>Update</strong></button>
 <a class="btn btn-primary " href="/intakeoffer/{{clientId}} ">
 <strong>Add Offer</strong>
 </a>
 <a class="btn btn-primary " href="/intakecheck/{{clientId}} ">
 <strong>Add check</strong>
 </a>
 </div>
 </div>
 </div>

但是说有其他方法可以解决这个问题,可能会更好。

而不是拥有可以添加和删除的线程队列。拥有由对象拥有的线程执行的作业队列。或者您只需使用void add(std::thread&& thread) { // ^^ mutex_add.lock(); threads.push(std::move(thread)); // ^^^^^^^^^ mutex_add.unlock(); } 即可在后台启动作业。