- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于在大约 64Mb RAM 的嵌入式系统中进行 C 并发编程的问题。特别是,我想减少线程使用的默认内存,所以我定义了:
pthread_attr_t attr_test;
size_t stacksize = 0x186A0; // 100Kbyte
pthread_attr_init(&attr_test);
pthread_attr_setdetachstate(&attr_test, PTHREAD_CREATE_DETACHED);
pthread_attr_setstacksize(&attr_test, stacksize);
因此,当线程启动时,它仅使用 100Kbyte 的虚拟内存。但是当线程结束并调用pthread_exit时,进程使用的虚拟内存会迅速增加!......
为什么?我能做什么?谢谢!
更新:
主题 ->
void *thread_test(void *arg1) {
int *param;
param = (int*)arg1;
printf("Thread %d start\n", *param);
pthread_cond_wait(&condition[*param], &mutex[*param]);
printf("Thread %d stop\n",*param);
pthread_exit(0);
}
主要 ->
int main(void) {
pthread_t IDthread[MAX_THREADS];
int param[MAX_THREADS];
int pointer;
int i, keyb;
void *stkaddr;
size_t stacksize;
puts("!!! THREAD TEST !!!");
printf("Process ID %d\n\n", getpid());
for(i=0; i<MAX_THREADS; i++)
{
pthread_cond_init(&condition[i], NULL);
pthread_mutex_init(&mutex[i], NULL);
IDthread[i] = 0;
param[i] = i;
}
stacksize = 0x186A0; // 100Kbyte
pthread_attr_init(&attr_test);
pthread_attr_setdetachstate(&attr_test, PTHREAD_CREATE_DETACHED);
/* setting the size of the stack also */
pthread_attr_setstacksize(&attr_test, stacksize);
pointer = 0;
do {
keyb = getchar();
if (keyb == '1')
{
if (pointer < MAX_THREADS)
{
pthread_create(&IDthread[pointer], &attr_test, thread_test, ¶m[pointer]);
sleep(1);
pointer++;
}
else
puts("MAX Threads Number");
}
if (keyb == '2')
{
if (pointer != 0)
{
pointer--;
pthread_cond_signal(&condition[pointer]);
sleep(1);
}
else
puts("0 Thread is running");
}
} while (keyb != '0');
printf("FINE\n");
return EXIT_SUCCESS;
}
最佳答案
可连接或分离线程存在一个已知问题,引用手册:
Only when a terminated joinable thread has been joined are the last of its resources released back to the system. When a detached thread terminates, its resources are automatically released back to the system
您可以使用以下方法使线程可拆卸:
pthread_attr_setdetachstate(3)
关于c++ - pthread_attr_setstacksize 和 pthread_exit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26590858/
海湾合作委员会 4.6.0 c89 我只是在尝试使用 pthread_exit 和 pthread_join。 我在 pthread_exit 中唯一注意到的是它在 main 返回之前没有显示打印消息
基本上,我试图理解 pthread_exit 的真正目的。 如您所见,我尝试过多个 pthread_exit 代码。 以下是我观察到的结果: - Exit 1: 42 - Exit 2: 42 - E
下面的代码简单地创建了两个线程并尝试获取它们的返回值。 我已经在 32 位 glibc-2.15 系统上编译并运行它并且一切正常(输出:r1: 1, r2: 2)。然而,当我在 64 位 glibc-
当我在初始线程中使用 pthread_exit() 时,初始线程切换到终止状态。但是我不明白这个过程。 能否存在初始线程处于终止状态的正在运行的进程? 最佳答案 在 pthreads 中,只要任何线程
我有一个结构 typedef struct something_t { int a; int b; } VALUES; 在我的线程函数中我这样做 VALUES values; valu
我有一个多线程程序,线程工作可能需要相对较长的时间。 如果我想停止程序的执行,我有一个原子开关,我将它从 0 更改为 1,这会向线程发出它应该退出的信号。这目前在 while 循环中进行检查。 然而,
我无法终止线程,即使在我关闭终端后它仍继续发送内容... void *RTPfun(void * client_addr); int main(int argc, char *argv[]) {
我正在尝试使用此示例代码找出 pthread_exit 的用法: void* PrintVar(void* arg) { int * a = (int *) arg; // we can ac
我创建了 2 个没有任何 pthread_exit() 的线程,并添加了 2 个 pthread_join() 有什么问题吗?是否可以? 最佳答案 您不需要调用 pthread_exit。线程函数可以
这让我很惊讶。 static int ret = 50; void * thread_func(void *arg) { pthread_exit(&ret); } int main(void
假设我创建了一个线程,在某个时候调用函数 foo()。如果我从 foo 中调用 pthread_exit(),结果会终止吗调用 foo 的线程? 谢谢,尼克斯 最佳答案 当然。否则 pthread_e
pthread_exit 在 return 0; 之前放置在 main() 中时确实会阻止线程在完成分配的任务之前退出。 我希望详细了解原因。 我在线程应该处理的函数中放置了一个 while 循环。w
(这个问题可能与 pthread_exit in signal handler causes segmentation fault 有点相关)我正在编写一个防止线程锁的库,其中始终有一个检查线程在执行
我有一个可连接的 pthread runner 函数,定义如下: void *sumOfProducts(void *param) { ... pthread_exit(0); } 这个线程应该加入主
我想从函数1创建一个线程来执行函数2。要获取函数2到函数1的完成状态,我需要做什么?函数2中是否强制pthread_exit将状态变量返回给函数1? 函数 2 的返回类型也应该是 void* 吗?那么
我有一个关于在大约 64Mb RAM 的嵌入式系统中进行 C 并发编程的问题。特别是,我想减少线程使用的默认内存,所以我定义了: pthread_attr_t attr_test; size_t st
我需要创建一个线程池,它可以工作,但是在函数 pthread_create 调用的函数 do_work 中,我在调用 pthread_exit() 时出现空闲(内存泄漏)问题 *在函数创建线程池中我只
根据 this “但是,如果线程调用 pthread_exit,C++ 不保证析构函数是调用线程堆栈上的所有自动变量。一个聪明的方法来恢复这个功能是在线程函数的顶层调用 pthread_exit抛出一
几天来我一直在处理线程池中的问题。我尝试了各种不同的方法,但似乎无法解决问题。我制作了一个重现该问题的简单版本。 代码: #include #include #include #include
我尝试创建 3 个线程来做事情并重复 2 次,我预计所有线程都会使用 pthread_exit(NULL) 退出,但似乎输出只显示一次,也许线程只创建了一次......? 我对 pthread_exi
我是一名优秀的程序员,十分优秀!