gpt4 book ai didi

c++ - pthread 启动函数中的 return() 与 pthread_exit()

转载 作者:IT老高 更新时间:2023-10-28 21:34:06 25 4
gpt4 key购买 nike

以下程序显示我们可以使用 returnpthread_exit 来返回一个 void* 变量可供 pthread_join 的状态变量。

  1. 是否应该优先使用一个而不是另一个?

  2. 为什么使用 return 有效?通常我们认为 return 将一个值放在堆栈上,但由于线程完成,堆栈应该消失。或者堆栈直到 pthread_join 之后才被销毁?

  3. 在你的工作中,你看到状态变量有很多用途吗?我看到的 90% 的代码似乎只是将状态参数设置为 NULL。由于通过 void* ptr 更改的任何内容都已反射(reflect)在调用线程中,因此返回它似乎没有多大意义。返回的任何新 void* ptr 都必须指向由启动线程创建的 malloc 内容,这让接收线程负责处理它。我认为状态变量是半无意义的,我错了吗?

代码如下:

#include <iostream>
#include <pthread.h>

using namespace std;

struct taskdata
{
int x;
float y;
string z;
};


void* task1(void *data)
{
taskdata *t = (taskdata *) data;

t->x += 25;
t->y -= 4.5;
t->z = "Goodbye";

return(data);
}

void* task2(void *data)
{
taskdata *t = (taskdata *) data;

t->x -= 25;
t->y += 4.5;
t->z = "World";

pthread_exit(data);
}


int main(int argc, char *argv[])
{
pthread_t threadID;

taskdata t = {10, 10.0, "Hello"};

void *status;

cout << "before " << t.x << " " << t.y << " " << t.z << endl;

//by return()

pthread_create(&threadID, NULL, task1, (void *) &t);

pthread_join(threadID, &status);

taskdata *ts = (taskdata *) status;

cout << "after task1 " << ts->x << " " << ts->y << " " << ts->z << endl;

//by pthread_exit()

pthread_create(&threadID, NULL, task2, (void *) &t);

pthread_join(threadID, &status);

ts = (taskdata *) status;

cout << "after task2 " << ts->x << " " << ts->y << " " << ts->z << endl;

}

输出:

before 10 10 Hello
after task1 35 5.5 Goodbye
after task2 10 10 World

最佳答案

(1) 在 C++ 代码中,使用 return导致堆栈展开并破坏局部变量,而 pthread_exit只保证调用注册到 pthread_cancel_push() 的取消处理程序.在某些系统上,这种机制还会导致调用 C++ 局部变量的析构函数,但这不能保证可移植代码 --- 检查您的平台文档。

另外,在 main() , return将隐式调用 exit() ,从而终止程序,而 pthread_exit()只会终止线程,程序将继续运行,直到所有线程都终止或某些线程调用 exit() , abort()或终止程序的另一个函数。

(2)return的使用有效,因为 POSIX 规范是这样说的。返回值存放在 pthread_join() 的位置。可以找回来。线程使用的资源直到 pthread_join() 才被回收。被调用。

(3) 我从不在原始 POSIX 线程中使用线程的返回值。但是,我倾向于使用更高级别的工具,例如 Boost 线程库,以及最近的 C++0x 线程库,它们提供了在线程之间传输值的替代方法,例如 future ,从而避免了与内存管理相关的问题。暗示。

关于c++ - pthread 启动函数中的 return() 与 pthread_exit(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3692591/

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