想换电脑的LoongLy 2024-10-18 17:37 采纳率: 42.9%
浏览 1

Lnux C语言多线程编程

child2函数中pthread_getspecific函数返回空指针

```c
#include <pthread.h>
#include<unistd.h>
#include <sys/types.h>
#include <wait.h>
#include <pthread.h>
#include <stdio.h>
pthread_t ntid1;
pthread_t ntid2;

pthread_key_t p_key;

void *child1(void *args);
void *child2(void *args);

void print_ids(const char *s);

int main()
{
    int    err1,err2;
    pthread_key_create(&p_key,NULL);
    err1 = pthread_create(&ntid1, NULL, child1, NULL);
    if (err1 != 0)
        return 1;
    err2 = pthread_create(&ntid2, NULL, child2, NULL);
    if (err2 != 0)
        return 1;

    err1 = pthread_join(ntid1, NULL);
    err2 = pthread_join(ntid2, NULL);
    pthread_key_delete (p_key);
    print_ids("main thread:");

    return 0;
}

void* child1(void *args)
{
    print_ids("Child1");
    return (void*)0;
}

void* child2(void *args)
{
    print_ids("Child2");

    pthread_setspecific(p_key, args);
    int *a = (int*)pthread_getspecific(p_key);
   // *a = 619;
    printf("Key = %p\n",a);
    return (void*)0;
}

void print_ids(const char *s)
{
    pid_t        pid;
    pthread_t    tid;

    pid = getpid();
    tid = pthread_self();
    printf("%s pid %lu tid %lu (0x%lx)\n", s, (unsigned long)pid,
           (unsigned long)tid, (unsigned long)tid);
}

```

  • 写回答

1条回答 默认 最新

  • 无疆76 2024-10-18 17:38
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的代码中存在一些问题,特别是在 child2 函数中使用 pthread_getspecific 时返回空指针的问题。这是因为你在设置特定键的值之前就已经尝试获取它。在调用 pthread_setspecific 之前,pthread_getspecific 将返回 NULL。此外,你的 child2 函数中的 args 参数并没有被使用,如果你想通过这个参数传递值给 pthread_setspecific,你需要在创建线程时提供一个非 NULL 的参数。这里有一些修复的建议:

    首先,当你调用 pthread_create 创建 child2 线程时,你可以传递一个整数值作为参数,然后在 child2 函数中使用这个参数。然后你可以在 child2 函数中先调用 pthread_setspecific 设置键值,然后再调用 pthread_getspecific 获取键值。下面是修改后的代码示例:

    #include <pthread.h>
    #include <stdio.h>
    
    pthread_t ntid1;
    pthread_t ntid2;
    
    pthread_key_t p_key;
    
    void *child1(void *args);
    void *child2(void *args);
    
    void print_ids(const char *s);
    
    int main() {
        int err1, err2;
        int value = 619; // 这是将要传递给child2的参数值
        pthread_key_create(&p_key, NULL);
        err1 = pthread_create(&ntid1, NULL, child1, NULL);
        if (err1 != 0) return 1;
        err2 = pthread_create(&ntid2, NULL, child2, (void*)&value); // 将value传递给child2函数
        if (err2 != 0) return 1;
        pthread_join(ntid1, NULL);
        pthread_join(ntid2, NULL);
        pthread_key_delete(p_key);
        print_ids("main thread:");
        return 0;
    }
    
    void* child1(void *args) {
        print_ids("Child1");
        return NULL;
    }
    
    void* child2(void *args) {
        print_ids("Child2");
        int value = *(int*)args; // 获取从主线程传递的值
        pthread_setspecific(p_key, &value); // 设置键值对应的值
        int *a = (int*)pthread_getspecific(p_key); // 再次获取键值对应的值,此时不会返回NULL指针了。但是这里要注意内存管理问题,如果其它地方还在使用这块内存的话可能会导致问题。通常我们不会频繁地创建和删除线程专用的数据。这个例子中我们只是简单地把值存储在特定的键上,然后立即读取它。如果这是一个更复杂的应用场景,你可能需要考虑更复杂的数据管理和线程同步策略。这里只是一个简单的例子来展示如何使用这些函数。在实际应用中你需要谨慎处理内存管理问题。如果你只是想验证这些函数的工作方式,那么上面的代码应该能满足你的需求。如果还有其他问题请继续提问。你可以通过在你的编译器中运行这段代码来查看它是否满足你的需求。这里我们只是简单地把值存储在特定的键上然后立即读取它这是一个非常简单的例子来展示如何使用这些函数。在实际应用中你需要考虑更复杂的数据管理和线程同步策略。另外注意这个例子没有处理错误的情况在实际的代码中你应该检查每个函数的返回值并适当处理错误情况以防止潜在的问题比如数据丢失或者程序崩溃等。```
    
    评论

报告相同问题?

问题事件

  • 创建了问题 10月18日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境