examples/multithread: fix race condition

Reported-by: Nick Korepanov
Fixes #19524
Closes #19526
This commit is contained in:
Stefan Eissing 2025-11-14 12:51:31 +01:00 committed by Daniel Stenberg
parent 5f4cd4c689
commit 971e8d661c
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2

View file

@ -50,14 +50,19 @@ static const char * const urls[NUMT]= {
"www.example"
};
static void *pull_one_url(void *pindex)
struct targ {
const char *url;
};
static void *pull_one_url(void *p)
{
CURL *curl;
struct targ *targ = p;
curl = curl_easy_init();
if(curl) {
int i = *(int *)pindex;
curl_easy_setopt(curl, CURLOPT_URL, urls[i]);
curl_easy_setopt(curl, CURLOPT_URL, targ->url);
(void)curl_easy_perform(curl); /* ignores error */
curl_easy_cleanup(curl);
}
@ -76,6 +81,7 @@ int main(void)
{
CURLcode res;
pthread_t tid[NUMT];
struct targ targs[NUMT];
int i;
/* Must initialize libcurl before any threads are started */
@ -84,10 +90,12 @@ int main(void)
return (int)res;
for(i = 0; i < NUMT; i++) {
int error = pthread_create(&tid[i],
NULL, /* default attributes please */
pull_one_url,
(void *)&i);
int error;
targs[i].url = urls[i];
error = pthread_create(&tid[i],
NULL, /* default attributes please */
pull_one_url,
(void *)&targs[i]);
if(error)
fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
else