نقل قول نوشته شده توسط kamiloted مشاهده تاپیک
امیدوارم به دردت بخوره.


typedef struct
{
double *a;
double *b;
double sum;
int veclen;
} DOTDATA;

/* Define globally accessible variables and a mutex */

#define NUMTHRDS 4
#define VECLEN 100

DOTDATA dotstr; //GLOBAL DATA which is going to be accessed by different threads

pthread_t callThd[NUMTHRDS];
pthread_mutex_t mutexsum;

void *dotprod(void *arg)
{

/* Define and use local variables for convenience */

int i, start, end, len ;
long offset;
double mysum, *x, *y;
offset = (long)arg;

len = dotstr.veclen;
start = offset*len;
end = start + len;
x = dotstr.a;
y = dotstr.b;

/*
Perform the dot product and assign result
to the appropriate variable in the structure.
*/

mysum = 0;
for (i=start; i<end ; i++)
{
mysum += (x[i] * y[i]);
}

/*
Lock a mutex prior to updating the value in the shared
structure, and unlock it upon updating.
*/
pthread_mutex_lock (&mutexsum);
dotstr.sum += mysum;
pthread_mutex_unlock (&mutexsum);

pthread_exit((void*) 0);
}

int main (int argc, char *argv[])
{
long i;
double *a, *b;
void *status;

/* Assign storage and initialize values */
a = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double));
b = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double));

for (i=0; i<VECLEN*NUMTHRDS; i++)
{
a[i]=1.0;
b[i]=a[i];
}

dotstr.veclen = VECLEN;
dotstr.a = a;
dotstr.b = b;
dotstr.sum=0;

pthread_mutex_init(&mutexsum, NULL);

for(i=0; i<NUMTHRDS; i++)
{
/*
Each thread works on a different set of data.
The offset is specified by 'i'. The size of
the data for each thread is indicated by VECLEN.
*/
pthread_create(&callThd[i], NULL, dotprod, (void *)i);
}

/* Wait on the other threads */
for(i=0; i<NUMTHRDS; i++)
{
pthread_join(callThd[i], &status);
}

printf ("Sum = %f \n", dotstr.sum);
free (a);
free (b);
pthread_mutex_destroy(&mutexsum);
pthread_exit(NULL);//No need of pthread_join() if pthread_exit() used.
}







class Program
{
static void Main()
{
Thread FirstThread = new Thread(new ThreadStart(Fun1));
Thread SecondThread = new Thread(new ThreadStart(Fun2));
FirstThread.Start();
SecondThread.Start();


}
public static void Fun1()
{
for (int i = 1; i <= 1000; i++)
{
Console.WriteLine("Fun1 writes:{0}", i);
}
}
public static void Fun2()
{
for (int i = 1000; i >= 6; i--)
{
Console.WriteLine("Fun2 writes:{0}", i);
}
}

}

سلام دوست عزیز و ممنونم از پاسختون.

کد اولی کد C++‎ هست و متأسفانه به کار من در کل نمیاد.

و کد دومی حس میکنم که بنده سوالم رو کمی بد مطرح کرده بودم. الان سعی میکنم که به روش بهتری سوالم رو دوباره تشریح کنم.

این مشکل زمانی اتفاق افتاد که من یک پروژه ای داشتم که باید چهار Picturebox رو همزان با سرعت های رندوم به سمتی حرکت میدادم. این پروسه از چند لایه رد میشه.اول رفرنسی از هر PictureBox به یه کلاس دیگه فرستاده میشه و اونجا سرعت و یک معیار تغییر سرعت تصادفی تعیین میشه و بعد این تابع چهار تا نخ به اضای هر PictureBox میسازه و استارت میکنه. ارور زمانی اتفاق می افته که تابعٍ آخرین کلاسی که رفرنس PictureBoxهارو دریافت میکنه میخواد PicuteBox رو به وسیله ی رفرنسی که دریافت کرده حرکت بده. اینجاست که کامپایلر ارور میده که PictureBox ها کلاسی از یک نخ دیگه هستن و این نخ نمیتونه به اونها دسترسی داشته باشه.

سوال من در واقع حل این مشکل بود.

ولی باز هم ممنون از پاسختون.

موفقو سربلند باشید.