我很困惑为什么我的程序没有按预期工作。
我有三个类似的功能:
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'完成后终止。我无法弄清楚为什么,我希望第二个函数调用工作,我想在我的主程序中添加更多代码。请告诉我我做错了什么。
答案 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);
...
}
等。然后它应该按预期工作。
作为旁注:在调试问题时,您应该注意崩溃消息(即“分段错误”)或编译器警告(全部启用!)。