多线程情况下,共享资源线程安全问题

在多线程情况下,如果不使用条件变量、锁和sleep(sleep时间之中任务可能就来了,那么就不能及时的处理),那么如何让没有任务的线程陷入阻塞,并且能够在分配任务立即处理任务?

可以考虑使用wait()和notify()方法进行线程间的通信和同步。


在每个线程的执行逻辑中:
循环执行以下步骤:
调用getTask()方法从队列中获取任务。
如果队列中没有任务,调用waitForTask()方法进入等待状态。
处理获取到的任务。


当有新任务需要分配时,调用addTask(task)方法将任务添加到队列中,并调用notifyForNewTask()方法唤醒一个线程。

有多种方式让线程在没有任务时自动阻塞,并在有新任务时立即开始执行。下面我举例两种。

std::mutex m;
std::condition_variable cv;
// 使用标准库中的condition_variable和mutex
// 线程函数
void thread_func() {
  std::unique_lock<std::mutex> lock(m);
  cv.wait(lock, []{return have_task();}); 
  // 处理任务
  do_task();
}

// 分配任务
void assign_task() {
  std::lock_guard<std::mutex> lock(m);
  add_task();
  cv.notify_one(); 
}
// condition_variable会自动释放锁并阻塞线程,有通知时会唤醒线程并重新获取锁。
// 使用future/promise来同步任务
// 线程函数 
void thread_func() {
  while(true) {
    auto task = get_task(); 
    task->process(); // 处理任务
  }
}

// 分配任务
std::promise<std::shared_ptr<Task>> p;
auto task = std::make_shared<Task>();
p.set_value(task); 
// future会阻塞线程直到promise有值。

及不及时的完全看你sleep的时间单位,如果你是秒级单位,那么任务自然是每秒查看一次,如果你是usleep,那就是微秒级单位,几乎可以达到立即执行的效果

自己做个线程池不就好了,管理线程也方便