Skip to content

Expose a public unsafe API to spawn threads with unrestricted lifetime bounds #2546

@oliver-giersch

Description

@oliver-giersch

Currently, the only way to spawn a thread is with 'static lifetime bounds on the closure and its return type. This makes sense for regular threads with an indeterminate lifetime. However, the std::thread module could also expose an explicitly unsafe way for spawning threads, with function signatures like the following:

//in std::thread

impl Builder {
    pub unsafe fn spawn_unchecked<F, T>(self, f: F) -> io::Result<JoinHandle<T>>
    where
        F: FnOnce() -> T,
        F: Send + 'a,
        T: Send + 'a {...}
}

and (for the free-standing version)

//in std::thread

pub unsafe fn spawn_unchecked<F, T>(self, f: F) -> io::Result<JoinHandle<T>>
where
       F: FnOnce() -> T,
       F: Send + 'a,
       T: Send + 'a {...}

Since the implementation of of Builder::spawn relies on unsafe code itself and the std::sys::thread types/functions don't require 'static lifetime bounds (haven't checked for all), this should be comparatively easy to implement by refactoring the spawn implementation into spawn_unchecked and calling that function with 'static lifetime bounds for the safe API.

The benefits would mainly be:

  • users could use the unsafe API to spawn "scoped" threads without resorting to external crates if they so desire (adding the responsibility to ensure manual joining of course)
  • safe and general implementations for actual scope threads could be simplified and made (slightly) more efficient

Currently, scoped thread implementations have to use a lot of tricks with their return types and lifetime transmuting to get to work. Results have to be separately allocated and internally set instead of using the std::thread::JoinHandle type, which would be much more fitting if not for the lifetime bounds on the spawn functions.
To summarize, scoped threads could be implemented more safely and with fewer allocations.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions