gpt4 book ai didi

multithreading - 如何正确使用线程专有数据

转载 作者:行者123 更新时间:2023-12-03 12:45:44 25 4
gpt4 key购买 nike

我正在使用 pthread 编程。我需要一个全局变量,它对不同的线程具有不同的值。线程将使用相同的函数来处理这个变量,比如改变它的值。如果一个线程改变了它的值,其他线程中的值就不会改变。所以我尝试使用线程特定数据,并写了一个例子。我需要将 pthread 操作包装在函数中。例如:setspecific()、changedata、printdata()、create_key()、delete_key() 等

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_key_t key;
pthread_key_t key2;

struct test_struct {
int i;
float k;
}struct_data;

int temp;

int setspecificvar () { /* Set specific data for threads */

pthread_setspecific (key, &struct_data);
pthread_setspecific (key2, &temp);

return 0;
}
int changedata (int i, float k, int tempvar) { /* Change specific data for threads */

temp = tempvar;
struct_data.i = i;
struct_data.k = k;

return 0;
}

int printdata (int t) { /* print specific data for threads */

printf ("The addres in child%d returned from pthread_getspecific(key):0x%p\n", \
t, (struct test_struct *)pthread_getspecific(key));

printf ("The value of members in structure bound to \"key\" in child%d:\nstruct_data.i:%d\nstruct_data.k: %f\n", \
t, ((struct test_struct *)pthread_getspecific (key))->i, \
((struct test_struct *)pthread_getspecific(key))->k);

printf ("------------------------------------------------------\n");

printf ("The addres in child%d returned from pthread_getspecific(key2):0x%p\n", \
t, (int *)pthread_getspecific(key2));
printf ("The value of \"temp\" bound to \"key2\" in child%d:%d\n", \
t, *((int *)pthread_getspecific(key2)));

return 0;
}

void *child1 (void *arg)
{
setspecificvar ();
changedata(10, 3.141500, 110); /* Should not change the data in child2 */
printdata(1);
}

void *child2 (void *arg)
{
/* sleep (2); */
setspecificvar ();

changedata(12, 2.141500, 120); /* Should not change the data in child1 */
printdata(2);

changedata (122, 22.141500, 1220); /* Should not change the data in child1 */
printdata (2);
}

int create_key () {
pthread_key_create (&key, NULL);
pthread_key_create (&key2, NULL);
return 0;
}

int delete_key () {

pthread_key_delete (key);
pthread_key_delete (key2);
return 0;
}

int main (void)
{
pthread_t tid1, tid2;

create_key ();
pthread_create (&tid1, NULL, (void *)child1, NULL);
pthread_create (&tid2, NULL, (void *)child2, NULL);
pthread_join (tid1, NULL);
pthread_join (tid2, NULL);

delete_key ();

return 0;
}

我创建了两个线程。当我让一个线程休眠 2 秒时。我得到正确答案。

The addres in child1 returned from pthread_getspecific(key):0x0x8049c98
The value of members in structure bound to *"key" in child1*:
*struct_data.i:10
struct_data.k: 3.141500*
------------------------------------------------------
The addres in child1 returned from pthread_getspecific(key2):0x0x8049ca0
The value of "temp" bound to *"key2" in child1*:110
The addres in child2 returned from pthread_getspecific(key):0x0x8049c98
The value of members in structure bound to "key" in child2:
struct_data.i:12
struct_data.k: 2.141500
------------------------------------------------------
The addres in child2 returned from pthread_getspecific(key2):0x0x8049ca0
The value of "temp" bound to "key2" in child2:120
The addres in child2 returned from pthread_getspecific(key):0x0x8049c98
The value of members in structure bound to "key" in child2:
struct_data.i:122
struct_data.k: 22.141500
------------------------------------------------------
The addres in child2 returned from pthread_getspecific(key2):0x0x8049ca0
The value of "temp" bound to "key2" in child2:1220

当我评论/* sleep(2); */,我得到不正确的答案。

The addres in child1 returned from pthread_getspecific(key):0x0x8049c54
The addres in child2 returned from pthread_getspecific(key):0x0x8049c54
The value of members in structure bound to "key" in child2:
*struct_data.i:12
struct_data.k: 2.141500*
The value of members in structure bound to *"key" in child1*:
struct_data.i:12
struct_data.k: 2.141500
------------------------------------------------------
The addres in child1 returned from pthread_getspecific(key2):0x0x8049c5c
The value of "temp" bound to *"key2" in child1*:120
------------------------------------------------------
The addres in child2 returned from pthread_getspecific(key2):0x0x8049c5c
The value of "temp" bound to "key2" in child2:120
The addres in child2 returned from pthread_getspecific(key):0x0x8049c54
The value of members in structure bound to "key" in child2:
struct_data.i:122
struct_data.k: 22.141500
------------------------------------------------------
The addres in child2 returned from pthread_getspecific(key2):0x0x8049c5c
The value of "temp" bound to "key2" in child2:1220

我想在不休眠线程的情况下获得正确的结果。一个线程不应该等待另一个线程完成调用 pthread_setspecific() ,对吗?我应该怎么办?感谢您的考虑。我将 struct_data 定义为全局变量是否正确?谁能帮帮我?

最佳答案

int setspecificvar () { /* Set specific data for threads */

pthread_setspecific (key, &struct_data);
pthread_setspecific (key2, &temp);

return 0;
}

在这里,您在每个线程中显式地将 keykey2 设置为相同的值,因此它具有每个线程中的值相同。尝试在每个线程中将其设置为不同值,然后它在每个线程中将具有不同的值。

一个常见的模式是这样的:

  1. 调用pthread_getspecific。如果它返回非 NULL,则使用该指针。

  2. 如果它返回 NULL,则使用动态分配线程特定对象的新实例。调用 pthread_setspecific 以确保从此线程对 pthread_getspecific 的下一次调用返回同一对象。

  3. pthread_key_create 调用中,确保注册一个析构函数,在线程消失时释放线程特定对象的实例。

这将为每个线程提供其自己的结构实例。

例如:

int setspecificvar () { /* Set specific data for threads */

struct test_struct *s = malloc(sizeof(struct test_struct));
int *i = malloc(sizeof(int *));
memset(s, 0, sizeof(s));
memset(i, 0, sizeof(i));

pthread_setspecific (key, s);
pthread_setspecific (key2, i);

return 0;
}

这实际上在每个线程中设置了不同的值。还有这个:

int changedata (int i, float k, int tempvar) { /* Change specific data for threads */

struct test_struct *struct_data = pthread_getspecific(key);
int *temp = pthread_getspecific(key2);

*temp = tempvar;
struct_data->i = i;
struct_data->k = k;

return 0;
}

这实际上使用线程特定的数据。

关于multithreading - 如何正确使用线程专有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14260668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com