You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环整数范围的最小值求解问题(多线程场景)

Finding the Minimum in a Cyclic Integer Range with Multi-Threaded Reception

Let's walk through how to solve this problem, covering thread-safe data collection, blocking for thread completion, and calculating the cyclic minimum.

Key Challenges to Address

  • Thread-Safe Data Sharing: Ensuring multiple threads can add values to a shared collection without race conditions.
  • Blocking for Completion: Waiting for all threads to finish receiving values (critical since some threads may process more values than others).
  • Cyclic Integer Handling: Correctly identifying the minimum value in a cyclic space (e.g., uint16_t wrapping from 65535 to 0).

Step-by-Step Solution

1. Thread-Safe Data Collection

Use a mutex to protect access to a shared container (like a vector) where each thread will store its received values. This prevents race conditions when multiple threads try to write to the container simultaneously.

2. Block Until All Threads Finish

After starting all worker threads, call join() on each thread from the main thread. This blocks the main thread until each worker completes its reception task, ensuring we have all values before computing the minimum.

3. Calculate the Cyclic Minimum

For cyclic unsigned integers (like uint16_t), the numerical minimum (using standard comparison operators) directly corresponds to the cyclic minimum. This is because unsigned integer comparison naturally respects the cyclic wrap (0 is considered smaller than 65535, which aligns with the cyclic order).

Example Implementation (C++)

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <cstdint>
#include <algorithm>

// Shared data and mutex for thread-safe access
std::vector<uint16_t> received_values;
std::mutex values_mutex;

// Simulates a thread receiving cyclic integers
void receive_values(int thread_id, int num_values) {
    // Replace this loop with your actual value reception logic
    for (int i = 0; i < num_values; ++i) {
        uint16_t val = (thread_id * 1000 + i) % 65536;
        // Lock the mutex before modifying the shared vector
        std::lock_guard<std::mutex> lock(values_mutex);
        received_values.push_back(val);
    }
}

int main() {
    const int num_threads = 4;
    std::vector<std::thread> threads;

    // Start worker threads with varying value counts
    threads.emplace_back(receive_values, 0, 500);
    threads.emplace_back(receive_values, 1, 1000);
    threads.emplace_back(receive_values, 2, 750);
    threads.emplace_back(receive_values, 3, 1200);

    // Block until all threads finish processing
    for (auto& t : threads) {
        t.join();
    }

    // Handle empty dataset case
    if (received_values.empty()) {
        std::cerr << "Error: No values received from any thread!" << std::endl;
        return 1;
    }

    // Find and print the cyclic minimum
    uint16_t min_val = *std::min_element(received_values.begin(), received_values.end());
    std::cout << "Cyclic minimum value: " << static_cast<uint32_t>(min_val) << std::endl;

    return 0;
}

Edge Cases to Consider

  • Empty Dataset: Always add a check for an empty collection before computing the minimum to avoid crashes.
  • Single Value: If only one value is received, it’s automatically the minimum.
  • Wrap-Around Values: If the dataset includes both 65535 and 0, the minimum will correctly resolve to 0.
  • Uneven Thread Counts: The join() mechanism ensures we wait for all threads, regardless of how many values each processes.

Notes on Blocking Mechanism

The join() call is non-negotiable here—it guarantees the main thread doesn’t attempt to process incomplete data. Without it, you might end up calculating a minimum based on only a subset of received values, leading to incorrect results.

内容的提问来源于stack exchange,提问作者flowit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:45:16