gpt4 book ai didi

C- 尝试将字符传递到 pthread_create,发生段错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:27 25 4
gpt4 key购买 nike

好吧,我已经创建了 4 个 pthread(我正在创建 4 个线程,每个线程将管理一个基本方向,北、南、东或西):

if ((rc = pthread_create(&tidn, NULL, threadcode, (void *)'n')) != 0)
fprintf(stderr, "thread create failed (%s)\n", strerror(rc)), exit(1);
if ((rc = pthread_create(&tids, NULL, threadcode, (void *)'s')) != 0)
fprintf(stderr, "thread create failed (%s)\n", strerror(rc)), exit(1);
if ((rc = pthread_create(&tide, NULL, threadcode, (void *)'e')) != 0)
fprintf(stderr, "thread create failed (%s)\n", strerror(rc)), exit(1);
if ((rc = pthread_create(&tidw, NULL, threadcode, (void *)'w')) != 0)
fprintf(stderr, "thread create failed (%s)\n", strerror(rc)), exit(1);

我已经有了我的线程代码函数

void *threadcode(void* dir)
{
char* direction;
struct cart_t *cart = NULL;

direction = (char*)dir;

printf("casted direction %c\n", *direction);

fprintf(stderr, "thread for direction %c starts\n", *direction);
cart = q_getCart(*direction);
while (cart != NULL) {
fprintf(stderr, "thread for direction %c gets cart %i\n",
*direction, cart->num);
monitor_arrive(cart);
monitor_cross(cart);
monitor_leave(cart);
cart = q_getCart(*direction);
}
fprintf(stderr, "thread for direction %c exits\n", *direction);

return NULL;
}

出于某种原因,线程已创建,但在创建的中途,代码段出错。我不确定它发生在哪里,但我很确定它在 threadcode 函数中的某个地方,因为线程将开始创建但随后会失败。

最佳答案

您传递给 pthread_create() 的内容出现严重错误:

  1. 它需要一个 void *。您正在尝试将 int 传递给它。这是实现定义的行为,在某些情况下可能 可以正常工作,但最好避免这种情况。传递给它一个实际的指针。

  2. 如果您确实传递了一个int,那么您至少应该在您的线程函数中将它转换回一个int。您实际上尝试转换为 char *,它甚至与您传递的内容相去甚远。然后,您尝试取消引用该虚假指针以获取一个字符,这就是您出现段错误的原因。

下面是您应该做什么的示例。请注意,如果没有某种同步(或 perror()),您不应该在多线程中调用 printf()fprintf() 等函数> 就此而言,但对于一个无论如何都会立即退出的简单示例,我会捕获机会)。您没有显示实现,但您调用的其他一些函数很有可能应该受到类似的保护。

#define _POSIX_C_SOURCE 200809L

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

pthread_mutex_t io_mtx = PTHREAD_MUTEX_INITIALIZER;

void * threadcode(void * arg)
{
const char c = *((char *) arg);

if ( pthread_mutex_lock(&io_mtx) != 0 ) {
perror("couldn't acquire mutex");
exit(EXIT_FAILURE);
}

printf("Entered thread for '%c'\n", c);

if ( pthread_mutex_unlock(&io_mtx) != 0 ) {
perror("couldn't release mutex");
exit(EXIT_FAILURE);
}

return NULL;
}

int main(void)
{
pthread_t tidn, tids, tide, tidw;
static char * dirs = "nsew";

/* Create threads */

if ( pthread_create(&tidn, NULL, threadcode, &dirs[0]) != 0 ) {
perror("couldn't create north thread");
return EXIT_FAILURE;
}
if ( pthread_create(&tids, NULL, threadcode, &dirs[1]) != 0 ) {
perror("couldn't create south thread");
return EXIT_FAILURE;
}
if ( pthread_create(&tide, NULL, threadcode, &dirs[2]) != 0 ) {
perror("couldn't create east thread");
return EXIT_FAILURE;
}
if ( pthread_create(&tidw, NULL, threadcode, &dirs[3]) != 0 ) {
perror("couldn't create west thread");
return EXIT_FAILURE;
}

/* State that threads are created */

if ( pthread_mutex_lock(&io_mtx) != 0 ) {
perror("couldn't acquire mutex");
exit(EXIT_FAILURE);
}

printf("Threads created\n");

if ( pthread_mutex_unlock(&io_mtx) != 0 ) {
perror("couldn't release mutex");
exit(EXIT_FAILURE);
}

/* Join threads */

if ( pthread_join(tidn, NULL) != 0 ) {
perror("couldn't join with north thread");
return EXIT_FAILURE;
}
if ( pthread_join(tids, NULL) != 0 ) {
perror("couldn't join with south thread");
return EXIT_FAILURE;
}
if ( pthread_join(tide, NULL) != 0 ) {
perror("couldn't join with east thread");
return EXIT_FAILURE;
}
if ( pthread_join(tidw, NULL) != 0 ) {
perror("couldn't join with west thread");
return EXIT_FAILURE;
}

return 0;
}

可能的输出:

paul@horus:~/Documents/src/sandbox$ ./thread
Entered thread for 'n'
Entered thread for 's'
Entered thread for 'w'
Threads created
Entered thread for 'e'
paul@horus:~/Documents/src/sandbox$

关于C- 尝试将字符传递到 pthread_create,发生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26432712/

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