线程无法正常工作

时间:2017-11-14 12:20:28

标签: c pthreads pthread-join

我很困惑为什么我的程序没有按预期工作。

我有三个类似的功能:

static void *L1(void *ptr )
{
    char *text = (char *)ptr;
    int ret;
    int fd = open("/dev/L1", O_RDWR); 

    ret = write(fd, text, strlen(Send)); // Send string to LKM
}

static void *L2(void *ptr )
{
    char *text = (char *)ptr;
    int ret;
    int fd = open("/dev/L2", O_RDWR); 

    ret = write(fd, text, strlen(Send)); // Send string to LKM
}

static void *L3(void *ptr )
{
    char *text = (char *)ptr;
    int ret;
    int fd = open("/dev/L3", O_RDWR); 

    ret = write(fd, text, strlen(Send)); // Send string to LKM
}

接下来我有一个创建线程的功能:

static void createKThread(void* (*a)(void *), void* (*b)(void *), void* (*c)(void *))

{
  pthread_t t1, t2, t3;
  int T1, T2, T3;

  T1 =  pthread_create(&t1, NULL, a, NULL);
  T2 =  pthread_create(&t2, NULL, b, NULL);
  T3 =  pthread_create(&td3, NULL, c, NULL);

  pthread_join(t1, NULL);
  pthread_join(t2, NULL);
  pthread_join(t3, NULL);

}

我的主要工作是:

     int main(){

     Send2[0] = 'a';
     createKThread(L1(&Send[0]), L2(&Send[0]), L3(&Send[0])); //First

     Send2[0] = 'b';
     createKThread(L1(&Send[0]), L2(&Send[0]), L3(&Send[0])); //Second
     return 0;
     }

我的主程序在第一个函数调用`createKThread'完成后终止。我无法弄清楚为什么,我希望第二个函数调用工作,我想在我的主程序中添加更多代码。请告诉我我做错了什么。

2 个答案:

答案 0 :(得分:0)

你弄乱了你的线程功能。 我假设你的函数L1等应该作为线程函数运行。

static void *L1(void *ptr )
{
    char *text = (char *)ptr;
    int ret;
    int fd = open("/dev/L1", O_RDWR); 

    ret = write(fd, text, strlen(Send)); // Send string to LKM
}

你的编译器不会对缺少返回值大喊大叫吗?

调用create函数时,可以传递这些函数的返回值:

createKThread(L1(&Send[0]), L2(&Send[0]), L3(&Send[0])); //First

不是传递函数的地址,而是调用它们! 当它们返回随机值时,您可以使用随机函数地址创建线程。

答案 1 :(得分:0)

下面:

 createKThread(L1(&Send[0]), L2(&Send[0]), L3(&Send[0])); //First

通过使用参数L1(&Send[0])调用L1来评估您的参数&Send[0]。这不是你想要的。您希望分别传递函数指针L1和参数,即:

createKThread(L1, &Send[0], L2, &Send[0], L3, &Send[0]);

static void createKThread(void* (*a)(void *), void *aarg,
                          void* (*b)(void *), void *barg,
                          void* (*c)(void *), void *carg) {
    ...
    T1 =  pthread_create(&t1, NULL, a, aarg);
    ...
}

等。然后它应该按预期工作。

作为旁注:在调试问题时,您应该注意崩溃消息(即“分段错误”)或编译器警告(全部启用!)。