使用条件变量而不是 lock_guard
use condition variable instead of lock_guard
我有一个简单的程序,我想在其中输出数字 1-100,其中一个线程输出所有奇数,另一个线程输出所有偶数。使用 lock_guard,这是一项非常容易的任务。代码如下:
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <thread>
std::mutex m;
void print_numbers(int i)
{
for (i; i <= 100; i++)
{
std::lock_guard<std::mutex> locker(m);
std::cout << i << std::endl;
++i;
}
}
int main()
{
std::thread t1(print_numbers, 0);
std::thread t2(print_numbers, 1);
t1.join();
t2.join();
return 0;
}
我的问题是,我怎样才能使用条件变量来做到这一点,也许可以让它更优雅一些?
您的代码中没有任何共享。每个线程都有一个局部变量 i。 POSIX条件用于线程间communication/signaling。这个想法很简单:
线程检查布尔谓词(取决于共享状态)并在谓词为假时决定 "wait"(pthread_cond_wait in POSIX)
另一个线程可以修改共享状态,因此影响布尔谓词的值。如果这个线程改变了状态,它可以通知另一个线程(线程#1)它应该醒来并重新检查它的谓词,其值现在可能已经改变(pthread_cond_signal 和 pthread_cond_broadcast in POSIX).
由于存在共享状态,您仍然需要一个互斥体来保护该共享状态,并且"lock it"在您修改或访问它时。
POSIX 条件的典型用例是共享队列。消费者希望从队列中获取 "consumes" 数据项,为此,必须等待布尔谓词 [队列非空]。生产者生成它存放在共享队列中的数据项。当它添加项目时,它应该通知任何 "waiters" 他们应该重新检查。
底线: 条件在这里没有帮助。您的示例中甚至不需要互斥锁。无论如何,条件都必须与互斥锁一起使用(对 pthread_cond_wait 的调用将互斥锁的地址作为输入,以自动释放锁并在条件下休眠)。 mutex 用于互斥。条件用于 信号 。两个截然不同的目的。
我有一个简单的程序,我想在其中输出数字 1-100,其中一个线程输出所有奇数,另一个线程输出所有偶数。使用 lock_guard,这是一项非常容易的任务。代码如下:
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <thread>
std::mutex m;
void print_numbers(int i)
{
for (i; i <= 100; i++)
{
std::lock_guard<std::mutex> locker(m);
std::cout << i << std::endl;
++i;
}
}
int main()
{
std::thread t1(print_numbers, 0);
std::thread t2(print_numbers, 1);
t1.join();
t2.join();
return 0;
}
我的问题是,我怎样才能使用条件变量来做到这一点,也许可以让它更优雅一些?
您的代码中没有任何共享。每个线程都有一个局部变量 i。 POSIX条件用于线程间communication/signaling。这个想法很简单:
线程检查布尔谓词(取决于共享状态)并在谓词为假时决定 "wait"(pthread_cond_wait in POSIX)
另一个线程可以修改共享状态,因此影响布尔谓词的值。如果这个线程改变了状态,它可以通知另一个线程(线程#1)它应该醒来并重新检查它的谓词,其值现在可能已经改变(pthread_cond_signal 和 pthread_cond_broadcast in POSIX).
由于存在共享状态,您仍然需要一个互斥体来保护该共享状态,并且"lock it"在您修改或访问它时。
POSIX 条件的典型用例是共享队列。消费者希望从队列中获取 "consumes" 数据项,为此,必须等待布尔谓词 [队列非空]。生产者生成它存放在共享队列中的数据项。当它添加项目时,它应该通知任何 "waiters" 他们应该重新检查。
底线: 条件在这里没有帮助。您的示例中甚至不需要互斥锁。无论如何,条件都必须与互斥锁一起使用(对 pthread_cond_wait 的调用将互斥锁的地址作为输入,以自动释放锁并在条件下休眠)。 mutex 用于互斥。条件用于 信号 。两个截然不同的目的。