|
14 | 14 | #include <queue> // 待ち行列(std::queue) |
15 | 15 | #include <thread> // std::thread |
16 | 16 | #include <mutex> // std::mutex |
| 17 | +#include <atomic> // std::atomic |
17 | 18 | #include <algorithm> // std::shuffle |
18 | 19 | #include <utility> // ???? |
19 | 20 | #include <random> // 新しい乱数生成。 |
@@ -60,8 +61,8 @@ namespace std { |
60 | 61 | // クロスワード生成用の名前空間。現状は「単語群から自動生成」のみ実装。 |
61 | 62 | // 将来的にはその他の生成方法もこのようなモダンな方向に移行する。 |
62 | 63 | namespace crossword_generation { |
63 | | -inline static bool s_generated = false; // 生成済みか? |
64 | | -inline static bool s_canceled = false; // キャンセルされたか? |
| 64 | +inline static std::atomic<bool> s_generated{false}; // 生成済みか? |
| 65 | +inline static std::atomic<bool> s_canceled{false}; // キャンセルされたか? |
65 | 66 | inline static std::mutex s_mutex; // ミューテックス(排他処理用)。 |
66 | 67 |
|
67 | 68 | // ルールを表すフラグ群。 |
@@ -1546,10 +1547,12 @@ struct from_words_t { |
1546 | 1547 | board0.replace('?', '#'); |
1547 | 1548 | if (is_solution(board0)) { // 盤面が解ならば |
1548 | 1549 | std::lock_guard<std::mutex> lock(s_mutex); // 排他制御しながら |
1549 | | - // 解をセットして |
1550 | | - s_generated = true; |
1551 | | - s_solution = board0; |
1552 | | - return true; // 成功。 |
| 1550 | + // キャンセルされていなければ解をセット |
| 1551 | + if (!s_canceled) { |
| 1552 | + s_generated = true; |
| 1553 | + s_solution = board0; |
| 1554 | + } |
| 1555 | + return !s_canceled; // キャンセルされていなければ成功。 |
1553 | 1556 | } |
1554 | 1557 | } |
1555 | 1558 | return s_generated; // 生成済みなら成功。 |
@@ -1930,9 +1933,12 @@ struct non_add_block_t { |
1930 | 1933 | // 盤面が解ならば成功。 |
1931 | 1934 | if (is_solution(m_board)) { |
1932 | 1935 | std::lock_guard<std::mutex> lock(s_mutex); |
1933 | | - s_generated = true; |
1934 | | - s_solution = m_board; |
1935 | | - return true; |
| 1936 | + // キャンセルされていなければ解をセット |
| 1937 | + if (!s_canceled) { |
| 1938 | + s_generated = true; |
| 1939 | + s_solution = m_board; |
| 1940 | + } |
| 1941 | + return !s_canceled; // キャンセルされていなければ成功。 |
1936 | 1942 | } |
1937 | 1943 |
|
1938 | 1944 | return s_generated; // 生成済みなら成功。 |
|
0 commit comments