C 64位中的setjmp/longjmp
我曾尝试在64位Ubuntu中使用setjmp/longjmp,但它不能正常工作,而在32位Ubuntu中工作正常。知道发生了什么吗。下面是我试图执行的代码 在64位上,它挂起,在longjmp之后返回。在维基百科关于的文章中,它说64位不能正常工作。setjmp是否存在同样的问题?事实上,我试图使用setjmp,以避免setcontext的问题,但在64位上似乎也有同样的问题C 64位中的setjmp/longjmp,c,linux,64-bit,x86,C,Linux,64 Bit,X86,我曾尝试在64位Ubuntu中使用setjmp/longjmp,但它不能正常工作,而在32位Ubuntu中工作正常。知道发生了什么吗。下面是我试图执行的代码 在64位上,它挂起,在longjmp之后返回。在维基百科关于的文章中,它说64位不能正常工作。setjmp是否存在同样的问题?事实上,我试图使用setjmp,以避免setcontext的问题,但在64位上似乎也有同样的问题 #include <stdio.h> #include <stdlib.h> #include
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <string>
#include <setjmp.h>
#define NOFTHREADS 2
#define DATASIZE 500
#define SETSIZE (DATASIZE / NOFTHREADS)
int data[DATASIZE];
pthread_mutex_t sumMutex;
pthread_mutex_t prodMutex;
int sum;
double prod;
static jmp_buf buf;
int jmp_onced[NOFTHREADS+1];
#define lock pthread_mutex_lock
#define unlock pthread_mutex_unlock
void *SumThread( void *pParam )
{
unsigned int tid = *((unsigned int*)(pParam));
int si = tid * SETSIZE;
int i, j, oi, local_sum;
double local_prod;
pthread_attr_t attr;
if ( setjmp(buf) )
printf( "%d: tid %u back! <<<<<<<<<\n", getpid(), tid );
if ( jmp_onced[tid] )
goto end_this;
printf( "%d: >>>>>>>>>>>>> tid %u, starting <<<<<<<<<<<<\n\n", getpid(), tid );
for( oi = 0; oi < 5; oi++ )
{
local_sum = 0;
local_prod = 1.0;
for( i = si; i < (si+SETSIZE); i++ )
{
local_sum = local_sum + data[i];
if ( data[i ] )
local_prod *= 0.005 * data[i];
}
lock( &sumMutex );
sum += local_sum;
unlock( &sumMutex );
lock( &prodMutex );
prod *= local_prod;
unlock( &prodMutex );
}
printf( "%d: !!!!!!!!!!!!!!tid %u done!!!!!!!!!!!!!!\n\n", getpid(), tid );
jmp_onced[tid] = 1;
longjmp( buf, 1 );
end_this:
printf( "%d: ****** tid %u is exiting! ******\n", getpid(), tid );
return 0;
}
void real_main()
{
pthread_t hThread[NOFTHREADS];
int index[NOFTHREADS];
int i, pid, err;
time_t t1 = time(NULL);
printf( "%d: Inside real_main, primary thread = %lx!\n", getpid(), pthread_self() );
for( i = 0; i < NOFTHREADS; i++ )
{
index[i] = i;
pthread_create( &hThread[i], NULL, SumThread, &index[i] );
}
for( i = 0; i < NOFTHREADS; i++ )
pthread_join( hThread[i], NULL );
printf( "Sum of numbers from 1 to %d is %d\n", DATASIZE, sum );
printf( "Prod of numbers from 1 to %d is %g\n", DATASIZE, prod );
printf( "\n\n[[[[[ %d(child of %d): Time taken = %lu seconds ]]]]]\n\n", getpid(), getppid(), time(NULL) - t1 );
}
int main(int argc, char **argv)
{
int pid, i, err;
printf( "size of long is %d\n", sizeof( long ) );
sumMutex = PTHREAD_MUTEX_INITIALIZER;
prodMutex = PTHREAD_MUTEX_INITIALIZER;
printf( "pid = %d, @sumMutex = %lx, @prodMutex = %lx\n", getpid(), (long)&sumMutex, (long)&prodMutex );
for( i = 0; i < DATASIZE; i++ )
data[i] = i+1;
switch(pid = fork())
{
case -1:
printf("fork failed");
break;
case 0: // Child
printf( "Child pid() = %d\n", getpid() );
real_main();
break;
default:// Leader
printf( "Parent pid() = %d\n", getpid() );
real_main();
}
printf( "getppid() = %d, getpid() = %d\n", getppid(), getpid() );
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义NOFTHREADS 2
#定义数据大小500
#定义SETSIZE(数据大小/NOFTHREADS)
int数据[数据大小];
pthread_mutex_t sumMutex;
pthread_mutex_t produtex;
整数和;
双针;
静态jmp_buf buf;
int jmp_onced[NOFTHREADS+1];
#定义锁pthread\u mutex\u lock
#定义unlock pthread_mutex_unlock
void*SumThread(void*pParam)
{
无符号整数tid=*((无符号整数*)(pParam));
int si=tid*设置大小;
int i、j、oi、局部和;
双本地生产;
pthread_attr_t attr;
if(setjmp(buf))
printf(“%d:tid%u back!>>>>tid%u,开始如果您没有声明本地变量volatile
,并且在调用setjmp()
后更改它们,那么在调用longjmp()
时,它们不保证被保留
(C99标准中的7.13.2.1/3)
但是这似乎不适用于这里,因为si
和tid
没有改变。如果你没有声明你的局部变量volatile
,并且你在调用setjmp()
后改变了它们,那么当你调用longjmp()
时它们就不能保证被保留
(C99标准中的7.13.2.1/3)
但这似乎不适用于这里,因为si
和tid
没有改变。您需要为每个线程使用一个单独的jmp\u buf
。当前您使用的是同一个线程。您需要为每个线程使用一个单独的jmp\u buf
。当前您使用的是同一个线程。重新标记C
这里面没有什么C++
。你需要解释一下“它不能正常工作”是什么意思。你有没有考虑过重写代码以便您不需要longjmp
等,b)您不需要goto
?Ed Heal只是出于某种目的测试了setjmp和longjmp的功能。这只是一个实验性代码。重新标记C
在这方面没有任何C++
。您需要解释“它不能正常工作”的意思"。您是否考虑过重写代码,以便a)您不需要longjmp
等,b)您不需要goto
?Ed Heal,只是出于某种目的测试setjmp和longjmp的功能。这只是一个实验性代码。有趣的是,我们将研究它。当然不需要。tid
和si
tersetjmp
Singhle UNIX规范也是如此。有趣的是,我们会研究它。当然不会。tid
和si
在setjmp
Singhle UNIX规范之后也不会改变。谢谢Alan。这正是问题所在。现在它工作得很好:-p!是的,一般来说,将跳转缓冲区作为静态变量没有多大意义le.只需在使用它的函数的堆栈中声明它。谢谢Alan。这正是问题所在。现在它工作正常:-p!是的,一般来说,将跳转缓冲区作为静态变量没有多大意义。只需在使用它的函数的堆栈中声明它。