我試過在64位的Ubuntu上使用setjmp/longjmp,但是它不能正常工作,而它在32位Ubuntu中可以正常工作。任何想法,發生了什麼。以下是我試圖執行的代碼。64位的setjmp/longjmp
在64位上,它掛起,在longjmp之後它返回的位置。在維基百科關於setcontext的文章中,它表示它無法在64位下正常工作。我們是否有與setjmp相同的問題?事實上,我試圖使用setjmp,以避免setcontext的問題,但它似乎在64位上有相同的問題。
#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;
}
重新標記'C'在這裏沒有任何'C++'。 –
你需要解釋你的意思是「它無法正常工作」。 –
你有沒有考慮重寫代碼,以便a)你不需要'longjmp'等等b)你不需要'goto'? –