تالار گفتمان مانشت
برنامه نویسی چند نخی programming thread - نسخه‌ی قابل چاپ

برنامه نویسی چند نخی programming thread - maryam94 - 24 فروردین ۱۳۹۴ ۰۷:۵۱ ق.ظ

سلام دوستان
من تازه با thread و c# کار می کنم و این ترم شدیدا بهشون نیاز دارم و در جفتشون بسیار مبتدی هستم یه سوال دارم که خیلی وقته تو حلش موندم
و هرکسی منبع خوب از c# , thread programming داره بزاره ممنونم

مرحله اول:
برنامه باید بتواند به تعداد n عدد thread بسازد. کار هر thread مقدار دهی قسمتی از یک آرایه با اعداد تصادفی
بین ۰تا ۱۰۰ است. در ورژن اول برنامه هر thread یک nام از آرایه را پر میکند که این یک به صورت متوالی
است. برای مثال اگر قرار باشد برنامه با ۱۰ thread اجرا شود هر کدام یک دهم آرایه را مقدار دهی میکنند. thread
اول از خانه اول تا صدهزارم، thread دوم از صدهزارم تا دویست هزارم و همینطور تا thread آخر که از نهصدهزارم
تا یک میلیون را مقدار دهی میکند.
زمان اجرای برنامه را از قبل از فراخوانی start برای thread ها تا بعد از join شدن همهی آنها بر حسب ثانیه و میلی
ثانیه )یا دقیقتر( محاسبه شود.


مرحله دوم:
برنامهی بالا را به گونهای تغییر کند که به عنوان مثال اگر تعداد thread ها ۴ عدد بود اولی اندیسها ۰,۴,۸,۱۲,… و
thread دوم اندیسهای ۱,۵,۹,۱۳,… و سومی ۲,۶,۱۰,۱۴,… و چهارمی ۳,۷,۱۱,۱۵,… را مقداردهی کنند. در حالت کلی
وقتی n نخ ساخته میشود اولی اندیسهایی را که باقیماندهی آنها بر n صفر است مقدار دهی میکند و دومی اندیسهایی که
باقیماندهی آنها بر n برابر ۶ است و همینطور تا آخرین نخ اندیسهایی که باقیماندهی آنها بر n برابر با (n-1) است را
مقداردهی میکند

برنامه نویسی چند نخی programming thread - Bache Mosbat - 24 فروردین ۱۳۹۴ ۰۱:۰۸ ب.ظ

دوستان اگر می تونید ایشون رو راهنمایی کنید. دوست عزیز حل تمرین آماده در مانشت خلاف قوانینه.در ضمن سوالتون رو جای اشتباه و دوجا پرسیده بودین که تاپیک قبلی حذف شد.

برنامه نویسی چند نخی programming thread - x86 - 24 فروردین ۱۳۹۴ ۰۲:۰۹ ب.ظ

از قرار معلوم که دنبال جواب مساله هستید. اگه خودتون کدی که نوشتید رو بذارید ما هم میتونیم مشکلاتش رو رفع کنیم. در غیر این صورت اینجا تمرین حل نمی کنیم.

ولی مختصر راهنمایی که میتونم انجام بدم اینه که آرایه و طول اون رو به عنوان متغیر سراسری تعریف کنید. یک تابع بسازید که یک ورودی به عنوان شماره ی نخ دریافت می کنه .(مثلا اگه N تا نخ دارید این ورودی از ۱ تا N متغیر خواهد بود). داخل تابع ابتدا حد پایین و بالای قسمتی که قراره این نخ پردازش کنه (مقدار دهی کنه) رو حساب کنید. مثلا اگه ورودی X هست و طول آرایه M هست به این صورت می تونید حد پایین و بالا رو حساب کنید:

Lower Bound = (M/N)*(X-1)
Upper Bound = (M/N)*(X)

حالا داخل یک حلقه که از حد پایین شروع میشه و به حد بالا میرسه اون خونه ها رو با عدد تصادفی پر کنید. داخل تابع Main هم کافیه یه حلقه بذارید که به تعداد N تا نخ درست کنه هر کدوم این تابعی که بالا توضیح دادیم رو با پارامتر مناسب اجرا کنن و در ادامه یه حلقه بنویسید که به ازای تمامی نخ ها تابع Join اونها رو فراخوانی کنه. می تونید برای تعریف نخ ها هم از یک آرای استفاده کنید که طول آرایه N هست.

RE: برنامه نویسی چند نخی programming thread - maryam94 - 24 فروردین ۱۳۹۴ ۱۱:۰۰ ب.ظ

سلام دوستان مرسی از دید مثبتتون من مشکلم در قسمت کنترل کردن بازه ترد ها و قسمتی که ۱ln را حساب می کنیم ممکنه که بخش پذیر نباشه و یک قسمت اضاف میاد که هیچ تردی اونو پر نمیکنه و واسه این سوالو کامل گذاشتم که ابهامی نباشه و واضح باشه

بازم ممنونم از لطف همگی
اینم کد نصفه [/align]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication4
{
class Program
{
int start;
int end;
static int[] Aray = new int[1000000];


public Program(int s,int e,int []array){
start= s;
end =e;
Aray= array;
}
private static Random R = new Random();
public void fill(){
int e;
int s;
s = start;
e = end;


for (int i = s; i < e; i++) {
Aray[i] = R.Next(1, 100);


}
}

static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
for (int i = 0; i <n; i++) {
Aray[i] = 0;
}


Thread []threadsArray=new Thread[n];
int p=1000000 / n;


// inam tabe zamaneshe
TimeSpan ts;
DateTime dt = DateTime.Now;

for (int i = 0; i < n; i++)
{
threadsArray[i].Start();
}

for (int i = 0; i < n; i++)
{
threadsArray[i].Join();
}


ts = DateTime.Now.Subtract(dt);
Console.WriteLine(ts.Hours + " : " + ts.Minutes + " : " + ts.Seconds + " : " + ts.Milliseconds);


int x = 0;
for (int i = 0; i < 1000000; i++) {
if (Aray[i]==0)
x++;

}

Console.WriteLine( " number of zeroo " + x);




}
}
}

RE: برنامه نویسی چند نخی programming thread - x86 - 24 فروردین ۱۳۹۴ ۱۱:۱۱ ب.ظ

(۲۴ فروردین ۱۳۹۴ ۱۱:۰۰ ب.ظ)maryam94 نوشته شده توسط:  سلام دوستان مرسی از دید مثبتتون من مشکلم در قسمت کنترل کردن بازه ترد ها و قسمتی که ۱ln را حساب می کنیم ممکنه که بخش پذیر نباشه و یک قسمت اضاف میاد که هیچ تردی اونو پر نمیکنه و واسه این سوالو کامل گذاشتم که ابهامی نباشه و واضح باشه

اگه مشکل فقط همین یه بخشه، میتونید تو تابعی که قرار اجرا بشه، این شرط رو بررسی کنید که اگر شماره ی نخ برابر با تعداد نخ ها بود Upper Bound رو برابر M، که تعداد خونه های آرایه هست، قرار بده.

RE: برنامه نویسی چند نخی programming thread - maryam94 - 24 فروردین ۱۳۹۴ ۱۱:۵۵ ب.ظ

خیلی ممنون که راهنماییم می کنید
ببخشید قسمت اضافی رو فهمیدم توضیحش اما اون قسمت اول که توضیح دادین نمیفهمم برنامه فقط یه ورودی داره اونم تعداد نخ هاست حالا ورودی x چیه؟میشه حلقه ای که می گید رو بنویسید

RE: برنامه نویسی چند نخی programming thread - x86 - 25 فروردین ۱۳۹۴ ۱۲:۱۴ ق.ظ

(۲۴ فروردین ۱۳۹۴ ۱۱:۵۵ ب.ظ)maryam94 نوشته شده توسط:  خیلی ممنون که راهنماییم می کنید
ببخشید قسمت اضافی رو فهمیدم توضیحش اما اون قسمت اول که توضیح دادین نمیفهمم برنامه فقط یه ورودی داره اونم تعداد نخ هاست حالا ورودی x چیه؟میشه حلقه ای که می گید رو بنویسید

کد php:
static int N ThreadCount;
static 
int M ArraySize;

void mythread (object threadNumber)
{
    
int X = (int)threadNumber;
    
int LowerBound =(M/N)*(X-1);
    
int UpperBound =(M/N)*(X);

    if(
X==N)
        
UpperBound M;

    
//TODO: write the loop