gpt4 book ai didi

C语言与多线程程序设计

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

我的问题与 C 中的线程编程有关。

我的问题是我只想在我的main 程序中创建两个线程。这两个线程应该顺序工作,这意味着我的第一个线程应该先执行(不应该执行任何线程的其他语句)。第一个线程应该有完全的控制权。在第一个线程完成之前,不应执行任何其他线程的其他语句,甚至 main 程序语句。

第一个线程完成后,第二个线程应该以与第一个类似的方式执行。

之后我的 main 应该执行。

我知道你可以说我到底为什么要这样做,因为这件事可以通过创建两个函数并按顺序调用它们来实现,但是为了学习和实验,我想在线程的帮助下完成.

我用C写了一些代码如下:

void* fun()
{
printf("\nThe thread 1 is running");
}
void* van()
{
printf("\nthread 2 is running ");
}

int main()
{
pthread_t t1,t2;
pthread_create(&t1,NULL,fun,NULL);
pthread_create(&t2,NULL,van,NULL);
printf("\nI'm in main\n");
pthread_join(t2,NULL);
}

程序运行良好,但我不理解函数 pthread_join() 的工作原理。

当我按如下方式稍微更改我的代码时:

int main()
{
pthread_t t1,t2;
pthread_create(&t1,NULL,fun,NULL);
pthread_join(t2,NULL); // Change
pthread_create(&t2,NULL,van,NULL);
printf("\nI'm in main\n");
}

现在,当我运行代码时,它显示了一个段错误。

现在我的问题如下:

  1. pthread_create() 函数中的属性参数是什么?我们为什么要使用它们?线程的默认属性是什么?请举例说明。
  2. pthread_create() 函数中的参数是什么?我们为什么要使用它们?线程的默认参数是什么?请举例说明。
  3. pthread_join() 实际上是如何工作的?当我的代码以 t2 作为第一个参数调用 main 中的 pthread_join() 时,这意味着什么。这是否意味着 main 应该暂停执行直到 t2 执行完成或其他什么?
  4. pthread_join() 中的第二个参数是什么?我们为什么用它?它的默认值是多少?请用示例或代码进行解释。

最佳答案

  1. The attr argument points to a pthread_attr_t structure whose contents are used at thread creation time to determine attributes for the new thread; this structure is initialized using pthread_attr_init(3) and related functions. If attr is NULL, then the thread is created with default attributes (source).

  2. 参数被传递给你的线程函数。这是将数据传递给线程的最佳方式(与使用全局变量相反,例如)。

  3. 是的,pthread_join 等待线程完成。这就是为什么在启动线程之前调用 pthread_join 时程序失败的原因,因为此时 t2 包含垃圾。

  4. If retval is not NULL, then pthread_join() copies the exit status of the target thread (i.e., the value that the target thread supplied to pthread_exit(3)) into the location pointed to by *retval. If the target thread was canceled, then PTHREAD_CANCELED is placed in *retval. (source).

也就是说,你可以让你的线程函数通知你它的执行结果。

鉴于此,您的线程创建可能如下所示:

struct th_arg{
...
};

static void th_work(struct th_arg* a){
//...some work
if (success) pthread_exit(EXIT_SUCCESS)
else pthread_exit(ERROR_CODE);
}

int main(){
int t1,t2;
struct th_arg[2];
int codes[2];
// initialize th_arg2
pthread_create(&t1, NULL, th_work, th_arg+0, th_arg+0);
pthread_create(&t2, NULL, th_work, th_arg+1, th_arg+1);
pthread_join(t1, codes+0);
pthread_join(t2, codes+1);

if (codes[0] == EXIT_SUCCESS && codes[1] == EXIT_SUCCESS){
...
}
}

关于C语言与多线程程序设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6223216/

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