On 4/21/21 9:53 PM, Jonathan Wakely wrote:
> On Wed, 21 Apr 2021 at 20:41, Martin Liška <mli...@suse.cz> wrote:
>>
>> On 4/21/21 9:15 PM, Jakub Jelinek wrote:
>>> On Wed, Apr 21, 2021 at 08:28:55PM +0200, Jakub Jelinek via Gcc-patches 
>>> wrote:
>>>>> There's a patch attempt for the problem with 
>>>>> std::thread::hardware_concurrency where
>>>>> it's used only if _GLIBCXX_HAS_GTHREADS is set.
>>>>>
>>>>> Does it help?
>>>>> Thanks,
>>>>> Martin
>>>>>
>>>>> gcc/ChangeLog:
>>>>>
>>>>>     PR bootstrap/100186
>>>>>     * lto-wrapper.c: Use hardware_concurrency only if
>>>>>     _GLIBCXX_HAS_GTHREADS.
>>>>> ---
>>>>>  gcc/lto-wrapper.c | 6 +++++-
>>>>>  1 file changed, 5 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
>>>>> index 6ba401007f6..8a85b3e93a8 100644
>>>>> --- a/gcc/lto-wrapper.c
>>>>> +++ b/gcc/lto-wrapper.c
>>>>> @@ -1285,7 +1285,11 @@ run_gcc (unsigned argc, char *argv[])
>>>>>    static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
>>>>>
>>>>>    /* Number of CPUs that can be used for parallel LTRANS phase.  */
>>>>> -  unsigned long nthreads_var = std::thread::hardware_concurrency ();
>>>>> +  unsigned long nthreads_var = 0;
>>>>> +
>>>>> +#ifdef _GLIBCXX_HAS_GTHREADS
>>>>> +  nthreads_var = std::thread::hardware_concurrency ();
>>>>> +#endif
>>>>
>>>> _GLIBCXX_HAS_GTHREADS is a libstdc++ internal macro, it shouldn't be used
>>>> outside of libstdc++.
>>>> And, when using some other compiler or standard C++ library, nthreads_var
>>>> will be always 0.  That isn't an improvement.
>>>
>>> What would be IMHO a good idea would be to use configure test for
>>> #include <thread>
>>> int t = std::thread::hardware_concurrency ();
>>> and in that case use that as a fallback to the previous implementation,
>>> that will be strictly an improvement.
>>
>> That does not make sense to me. Original motivation was removal of the 
>> complicated
>> implementation with a C++ standard function.
>>
>> @Jonathan:
>>
>> What standard says about usage of std::thread::hardware_concurrency() [1]?
>> The function is defined in C++11, how can one detect if threading is enabled
>> in the C++ library and use it?
> 
> A configure test.
> 
> The standard says it's required to exist, but libstdc++ has
> traditionally not defined things that are not supportable on the
> target.

Which seems logical to me.

> So for targets with no multithreading, we didn't define
> anything in <thread>. Even though that has changed in current releases
> (so that std::thread exists even if it's useless), that won't help you
> with previous releases. You need a configure test.

All right.

> 
> As I said in the PR, opinions differ on whether it's better to define
> everything (even if it's useless) or not define them. Arguably, users
> on small embedded targets do not want the library to waste space
> defining a useless std::thread class that just throws an exception if
> you ever try to create a new thread (but that's what the standard
> requires).
> 

I think defining only things that work is the right way.

Martin

Reply via email to