0
A
答えて
1
Waitfreeシングルプロデューサー/シングル・コンシューマリンクリストベースのキュー: http://www.1024cores.net/home/lock-free-algorithms/queues/unbounded-spsc-queue
1
ここではhttp://www.drdobbs.com/cpp/210604448記事に基づいて、私の解決策です。しかし、スレッドセーフなのかどうかはわかりません。さて、これは再表示サイトではありませんが、何か間違っている場合は教えてください。誰もがこのコードを自由に使うことができます。mallocの部分は、ロックフリーのメモリプールアロケータと交換する必要があります。
#ifndef QUEUE_HPP_INCLUDED
#define QUEUE_HPP_INCLUDED
#include <Windows.h>
/// @brief A single reader, single writer queue
template <typename T>
class LockFreeQueue {
private:
/// @brief Node of the queue
struct Node {
Node(T* val) : value(val), next(0) { }
T* value;
Node* next;
};
Node* first; // for producer only
Node* divider; // shared
Node* last; // shared
// no copy
LockFreeQueue& operator=(const LockFreeQueue&);
LockFreeQueue(const LockFreeQueue&);
public:
/// @brief Constructor
LockFreeQueue()
: first(new Node(0)),
divider(first),
last(first)
{
}
/// @brief Destructor
~LockFreeQueue()
{
while(first != 0)
{
// release the list
Node* tmp = first;
first = tmp->next;
delete tmp;
}
}
/// @brief Pushes to the end of the queue
/// @warning Must only be called from the producer
void push_back(T* t)
{
last->next = new Node(t); // add the new item
// publish it
InterlockedExchangePointer(&last, last->next); // last = last->next;
while(first != divider)
{ // trim unused nodes
Node* tmp = first;
first = first->next;
delete tmp;
}
}
/// @brief Pop an element from the front
/// @warning Must only be called from the consumer
/// @return true If a node was popped
/// @return false If queue is empty
bool pop_front(T* result)
{
if(divider != last)
{
// if queue is nonempty
result = divider->next->value; // C: copy it back
// D: publish that we took it
InterlockedExchangePointer(÷r, divider->next); // divider = divider->next;
return true; // and report success
}
return false; // else report empty
}
/// @brief Points to the element at the front
/// @warning Must only be called from the consumer
/// @return 0 if queue is empty
/// @return Pointer to the first node
T* front()
{
T* t = 0;
if(divider != last)
{
t = divider->next->value;
}
return t;
}
};
#endif // QUEUE_HPP_INCLUDED
関連する問題
- 1. Qtプロジェクトファイル:!win32用
- 2. win32/Unix用C++ portable NaN
- 3. ネイティブWin32アプリケーション用のビジュアルデザイナ
- 4. マネージコードでのwin32の使用
- 5. Win32リソースエディタライブラリ?
- 6. のWin32:
- 7. Win32カスタムメッセージボックス
- 8. ワードラップWin32
- 9. win32プロジェクトデザイナー
- 10. win32 DLLを使用したXBAPのデプロイ
- 11. Win32でのGNU gettextの使用
- 12. Win32のネイティブC/C++用のハイレベルHTTPクライアントライブラリ
- 13. Win32 APIのみを使用するスレッドバリアクラス
- 14. ネイティブアプリケーションでwin32を使用する
- 15. linuxプラットフォームでdll win32を使用する
- 16. Win32のイベントを使用すると、
- 17. Win32スレッドを使用したC++/CLIリファレンスクラス
- 18. Win32コンソールアプリケーションでShutdownBlockRequestCreateを使用する
- 19. Delphi Win32でThriftを使用する
- 20. WPFとWin32メッセージ
- 21. Win32のCreatePatternBrush
- 22. GlobalMemoryStatusEx()(Win32の)
- 23. グローバルホットキーリリース(キーアップ)? (WIN32 API)
- 24. はgethostbyaddr()のWin32
- 25. Win32 APIの
- 26. fstream .open()Win32
- 27. Win32 EXCEPTION_INT_OVERFLOW対EXCEPTION_INT_DIVIDE_BY_ZERO
- 28. python win32 extensions documentation
- 29. Win32.memcpyエラーセグメンテーション
- 30. ビルドGhostScript 9.04 Win32