में एक सी ++ 11 कंडीशन वैरिएबल का उपयोग करके मैं एक साधारण वीएस2012 कंसोल एप्लिकेशन में भरोसेमंद कोड प्राप्त नहीं कर सकता जो एक निर्माता और उपभोक्ता है जो सी ++ 11 कंडीशन वैरिएबल का उपयोग करता है।वीएस2012
condition_variable:: मैं (एक अधिक जटिल कार्यक्रम के लिए आधार के रूप में उपयोग करने के लिए) एक छोटे से विश्वसनीय प्रोग्राम कोड मैं इन वेबसाइटों पर इकट्ठे हुए हैं से विधि या शायद wait_until विधि wait_for 3 तर्क का उपयोग करता है के उत्पादन में लक्ष्य कर रहा हूँ wait_for , wait_until
मैं नीचे दिए गए भविष्य के साथ 3 तर्क प्रतीक्षा_for का उपयोग करना चाहता हूं सिवाय इसके कि इसे बाद में मेरे लिए सबसे उपयोगी होने के लिए कक्षा सदस्य चर का उपयोग करने की आवश्यकता होगी। मुझे "उल्लंघन उल्लंघन लेखन स्थान 0x_ _" या "एक अमान्य पैरामीटर किसी सेवा या फ़ंक्शन में पास किया गया था" केवल एक मिनट चलने के बाद त्रुटियों के रूप में।
steady_clock और 2 तर्क wait_until 3 तर्क wait_for को प्रतिस्थापित करने के लिए पर्याप्त होगा? मैंने सफलता के बिना भी कोशिश की है।
क्या कोई दिखा सकता है कि बिना किसी बग या अजीब व्यवहार के बिना अनिश्चित काल तक चलाने के लिए नीचे कोड कैसे प्राप्त किया जा सकता है, जिसमें डेलाइट बचत समय या इंटरनेट समय सिंक्रनाइज़ेशन से दीवार घड़ी के समय में परिवर्तन शामिल हैं?
विश्वसनीय नमूना कोड का एक लिंक उतना ही उपयोगी हो सकता है।
// ConditionVariable.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>
#include <queue>
#include <chrono>
#include <atomic>
#define TEST1
std::atomic<int>
//int
qcount = 0; //= ATOMIC_VAR_INIT(0);
int _tmain(int argc, _TCHAR* argv[])
{
std::queue<int> produced_nums;
std::mutex m;
std::condition_variable cond_var;
bool notified = false;
unsigned int count = 0;
std::thread producer([&]() {
int i = 0;
while (1) {
std::this_thread::sleep_for(std::chrono::microseconds(1500));
std::unique_lock<std::mutex> lock(m);
produced_nums.push(i);
notified = true;
qcount = produced_nums.size();
cond_var.notify_one();
i++;
}
cond_var.notify_one();
});
std::thread consumer([&]() {
std::unique_lock<std::mutex> lock(m);
while (1) {
#ifdef TEST1
// Version 1
if (cond_var.wait_for(
lock,
std::chrono::microseconds(1000),
[&]()->bool { return qcount != 0; }))
{
if ((count++ % 1000) == 0)
std::cout << "consuming " << produced_nums.front () << '\n';
produced_nums.pop();
qcount = produced_nums.size();
notified = false;
}
#else
// Version 2
std::chrono::steady_clock::time_point timeout1 =
std::chrono::steady_clock::now() +
//std::chrono::system_clock::now() +
std::chrono::milliseconds(1);
while (qcount == 0)//(!notified)
{
if (cond_var.wait_until(lock, timeout1) == std::cv_status::timeout)
break;
}
if (qcount > 0)
{
if ((count++ % 1000) == 0)
std::cout << "consuming " << produced_nums.front() << '\n';
produced_nums.pop();
qcount = produced_nums.size();
notified = false;
}
#endif
}
});
while (1);
return 0;
}
विजुअल स्टूडियो डेस्कटॉप एक्सप्रेस में 1 महत्वपूर्ण अपडेट था जो इसे स्थापित किया गया था और विंडोज अपडेट में कोई अन्य महत्वपूर्ण अपडेट नहीं है। मैं विंडोज 7 32-बिट का उपयोग कर रहा हूँ।
आपका कोड 'wait_for' या' wait_until' का उपयोग नहीं करता है और इसलिए ओ पी की समस्या का समाधान नहीं होता। –